2012-02-25 85 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 

你将不得不做一些更多的工作来使它抵抗不同类型的错误,但应该是一个很好的起点。希望这可以帮助。