unix - автоматически определять разделитель полей и запись (EOL) - PullRequest
0 голосов
/ 25 февраля 2012

Скажем, у вас есть 20 файлов, и вы не будете смотреть на каждый из них, а вместо этого попросите скрипт определить формат файла.

т.е. bash findFileFormat direcName

Затемциклически просматривает каждый файл в каталоге и распечатывает имя файла, а также имеет ли он разделитель (в этом случае это запятая, труба или иное) или фиксированный с помощью разделителя полей, а затем разделитель записей.то есть CR, LF, Ctrl + Z символ.etc

Я думал, потому что некоторые файлы могут иметь много каналов и запятых в данных, что он может использовать счетчик каждого символа в строке, чтобы определить, чтоdelimiter is -> если этот процесс не выдает согласованные числа символов в строке, можно с уверенностью предположить, что файл использует разделитель полей фиксированной ширины.

Есть ли команда или сценарий, которые можно использовать для определения этих 2 битов информации для каждого файла?

1 Ответ

2 голосов
/ 25 февраля 2012

Вот небольшой скрипт на 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

Вы должны были бы проделать еще некоторую работу, чтобы сделать это устойчивым к различным видам ошибок, но должны быть хорошей отправной точкой.Надеюсь это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...