簡體   English   中英

UNIX-自動確定字段分隔符和記錄(EOL)分隔符?

[英]unix - automatically determine field separator and record (EOL) separator?

假設您有20個文件,而您不會看每個文件,而是有一個腳本來確定文件的格式。

即bash findFileFormat direcName

然后循環遍歷目錄中的每個文件,並打印出文件名以及是否有定界符(在這種情況下,它是逗號,管道還是其他符號)或用for字段分隔符固定,然后是記錄分隔符固定。 即CR,LF,Ctrl + Z字符等

我當時在想,因為某些文件的數據中可能包含很多豎線和逗號,所以它可以使用每行每個字符的計數來確定分隔符是什么->如果此過程不能在每個字符中產生一致的字符數可以肯定地說,該文件使用了固定寬度的字段分隔符。

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

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

您將需要做更多的工作才能使它能夠抵抗各種錯誤,但這應該是一個很好的起點。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM