2012-02-25 29 views
0

假設你有20個文件,你不會看每一個文件,而是有一個腳本來決定文件的格式。unix - 自動確定字段分隔符和記錄(EOL)分隔符?

即bash的findFileFormat direcName

然後通過在一個目錄中的每個文件循環並打印出的文件名加它是否具有一個定界符(在這種情況下它是一個逗號,管或其它的)或固定有用於字段分隔符然後什麼是記錄分隔符。即CR,LF,Ctrl + Z character.etc

我在想,因爲有些文件可能在數據中有很多管道和逗號,它可以使用每行每個字符的計數來確定分隔符是什麼 - >如果這個過程不會產生每行字符的一致數字,那麼假設該文件使用固定寬度的字段分隔符是安全的。

是否有可用於確定每個文件的這2位信息的命令或腳本?

+1

不管你如何編寫程序,你都必須設計一個非常複雜的類人邏輯來準確地做你想做的事情。想想你打開一個文件以確定格式時你的大腦所做的所有事情。有時候很容易發現(即你看到的標籤和所有列都對齊),但有時它不會那麼清楚。事實是,不管你怎麼做,最好的辦法是給出一個「最好的匹配」,給出一個可能的分隔符列表,但只是準確地找到它對於任何類型的文件來說都不是那麼簡單。 – 2012-02-25 03:32:51

回答

2

這裏有一個小的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 

你將不得不做一些更多的工作來使它抵抗不同類型的錯誤,但應該是一個很好的起點。希望這可以幫助。