Есть ли способ точно проанализировать настоящий CSV-файл?

Потерял данные. Будущим читателям: сохраните данные на внешнем диске:)

0
27.01.2020, 17:59
3 ответа

Где-то у меня есть awk-скрипт, который работает со всем, что я когда-либо видел, когда Excel выводит :переменное число полей; запятые, новые строки и двойные -кавычки в полях; поля в кавычках даже там, где они не нужны; строка заголовка столбца; обрезать пустое пространство; Преобразование CRLF. Мне нужно найти его --Я думаю, что он конвертировался между несколькими форматами и занял около 300 строк (, включая собственную справочную страницу ). Также делает некоторую статистику по столбцам, чтобы помочь вам указать DDL.

Основная проблема заключается в том, чтобы решить, в каком формате вы хотите получить результат. Я остановился на "|" разделительные полосы для полей и $ для новых строк, чтобы избежать распространения одних и тех же проблем в выводе. Было бы легко использовать (, например )ASCII 0x1f (Разделитель единиц )для столбцов и 0x1D (Разделитель групп )для новой строки в поле -.

Я вижу ссылки на предыдущую тему, в которой упоминаются различные инструменты и библиотеки. Я написал это, когда застрял с заблокированной -неработающей критической системой --без загрузок. Мне даже не разрешили использовать C на случай, если я сломаю продукт их поставщика,но они признали: «Я мог бы писать сценарии --, вы не можете причинить им никакого вреда».

0
28.01.2020, 02:54

Входной файл a.csv:

1,1111,"111 W. Merchandise Mart's Plaza, Suite 1111",10101
2,2222,"222 Ben's St, Suite 222",20202

Один лайнер для парсинга входного файла с использованием Python 3:

$ cat a.csv|python -c $'import csv,sys;reader=csv.reader(sys.stdin);\nfor row in reader: print row'

Выход:

['1', '1111', "111 W. Merchandise Mart's Plaza, Suite 1111", '10101']
['2', '2222', "222 Ben's St, Suite 222", '20202']

Более сложный один вкладыш с выходом:

$ cat a.csv |python -c $'import csv,sys;reader=csv.reader(sys.stdin);\na=0\nb=0\nfor row in reader:\n\ta+=1\n\tprint "Column",a\n\tfor col in row:\n\t\tb+=1\n\t\tprint "\tColumn",b,":",col'
Column 1
        Column 1 : 1
        Column 2 : 1111
        Column 3 : 111 W. Merchandise Mart's Plaza, Suite 1111
        Column 4 : 10101
Column 2
        Column 5 : 2
        Column 6 : 2222
        Column 7 : 222 Ben's St, Suite 222
        Column 8 : 20202

Читаемая версия второго вкладыша:

import csv,sys;
reader=csv.reader(sys.stdin);
a=0
b=0
for row in reader:
    a+=1
    print "Column",a
    for col in row:
        b+=1
        print "    Column",b,":",col

Гну авк (гавк):

$ cat a.csv| awk -vFPAT='[^,]*|"[^"]*"' '{for (i=1; i<=NF; i++) {print ">"$i"<"}; print ""}'
>1<
>1111<
>"111 W. Merchandise Mart's Plaza, Suite 1111"<
>10101<

>2<
>2222<
>"222 Ben's St, Suite 222"<
>20202<
1
28.01.2020, 02:54

cvskitэто то, что вам нужно :он имеет надежный grep, cut, join,..., для файлов CSV. Я буду использовать только csvformat.

В подобных ситуациях я предпочитаю:

(1 )преобразовать входные данные в «хороший» разделитель (ex :«,» в «§» )удаление ненужных кавычек

csvformat -d § input |...

(2 )обработать данные с "хорошим" разделителем

... | awk 'BEGIN{FS=OFS="§"}...' |...

(3 )снова преобразовать в CSV ("§" в "," )добавление кавычек при необходимости

csvformat -D § > final

2
28.01.2020, 02:54

Теги

Похожие вопросы