這裏有一個小的Python腳本,將您所需要的做的出發點:
import sys
separators = [',', '|']
file_name = sys.argv[1]
def sep_cnt(line):
return {sep:line.count(sep) for sep in separators}
with open(file_name, 'r') as inf:
lines = inf.readlines()
cnts = [sep_cnt(line) for line in lines]
print(cnts)
def cnts_red(a, b):
c = {}
for k, v in a.iteritems():
if v > 0 and v == b[k]:
c[k] = v
return c
final = reduce(cnts_red, cnts[1:], cnts[0])
if len(final) == 0:
ftype = 'fixed'
else:
ftype = 'sep by ' + str(final.iteritems().next()[0])
print(ftype)
名以上heur_sep.py並運行此安全的地方(例如,/ tmp目錄):
# Prepare
rm *.txt
# Commas
cat >f1.txt <<e
a,a,a,a
b,b,b,b
c,c,c,c
e
# Pipes
cat >f2.txt <<e
a|a|a|a
b|b|b|b
c|c|c|c
e
# Fixed width
cat >f3.txt <<e
1 2 3
1 2 3
1 2 3
e
# Fixed width with commas
cat >f4.txt <<e
1, 2 3
1 2, 3
1 2, 3,
e
for i in *.txt; do
echo --- $i
python heur_sep.py $i
done
你將不得不做一些更多的工作來使它抵抗不同類型的錯誤,但應該是一個很好的起點。希望這可以幫助。
不管你如何編寫程序,你都必須設計一個非常複雜的類人邏輯來準確地做你想做的事情。想想你打開一個文件以確定格式時你的大腦所做的所有事情。有時候很容易發現(即你看到的標籤和所有列都對齊),但有時它不會那麼清楚。事實是,不管你怎麼做,最好的辦法是給出一個「最好的匹配」,給出一個可能的分隔符列表,但只是準確地找到它對於任何類型的文件來說都不是那麼簡單。 – 2012-02-25 03:32:51