假设您有 20 个文件,您不想查看每个文件,而是让脚本确定文件的格式。
ie bash findFileFormat direcName
然后循环遍历目录中的每个文件并打印出文件名加上它是否有分隔符(在这种情况下是逗号、竖线或其他)或固定为字段分隔符,然后是记录分隔符。即 CR, LF, Ctrl+Z character.etc
我在想,因为有些文件的数据中可能有很多竖线和逗号,它可以使用每行每个字符的计数来确定分隔符是什么 --> 如果这个过程没有产生一致的数量每行的字符 假设文件使用固定宽度的字段分隔符是安全的。
是否有命令或脚本可用于确定每个文件的这 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
您将不得不做更多的工作来使其能够抵抗不同类型的错误,但这应该是一个很好的起点。希望这可以帮助。
关于linux - unix - 自动确定字段分隔符和记录(EOL)分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9440599/