Intereting Posts
Как избавиться от нежелательного входного повторяющегося пояса? Как связать файл по сети? ls -lh vs du -sh * для размеров файлов в каталоге Как удалить RHEL из системы с двойной загрузкой? Как я могу заставить SOCKS proxy (Danted) открыть UDP-порт Изменение измененной даты файла в зависимости от даты в имени файла Может ли строка «abcedf» соответствовать строке «bafcde» в одной строке? Может ли домашний каталог иметь файлы .cshrc и .bashrc? Объединить входные данные из нескольких файлов / труб без сбивающих линий или блокировки? копирование удаленных корневых файлов, когда «PermitRootLogin no» Как запустить скрипт с systemd перед выключением? Почему результат этого цикла for и while отличается? Как скрипт `make menuconfig`? Выполните команду в течение определенного времени и затем прервите, если время превышает mutt: thread, отсортированный по последней активности, но упорядоченные по почте рассылки

Исправление CSV-файла, в котором в некоторых строках отсутствуют столбцы.

В настоящее время я работаю с данными многих объединенных файлов .csv. К сожалению, эти слияния иногда ошибочны.

Это лучше всего объяснить этим примером:

“var1”, “var2”, “var3”, “var4”, “var5”
“2001”, “желтый”, “123”, “abc”, “bcdefg”
“2002”, “желтый”, “123”, “abw”, “asdfkl”
“2001”, “зеленый”, “абэ”
“2002”, “зеленый”, “abp”
“2001”, “синий”, “324”, “abx”, “badsf”
“2002”, “синий”, “231”, “abl”, “cpq”

Так что в строках 3 и 4 значения для var3 и var5 отсутствуют. Ошибки, переменные (столбцы) которых отсутствуют, всегда одинаковы.

Я хочу, чтобы мой CSV выглядел так:

“var1”, “var2”, “var3”, “var4”, “var5”
“2001”, “желтый”, “123”, “abc”, “bcdefg”
“2002”, “желтый”, “123”, “abw”, “asdfkl”
“2001”, “зеленый”, “абэ”,
“2002”, “зеленый”, “abp”,
“2001”, “синий”, “324”, “abx”, “badsf”
“2002”, “синий”, “231”, “abl”, “cpq”

Так что теперь в строках 3 и 4 фактически отсутствуют значения для var3 и var5. Ошибки не всегда бывают для (в этом примере) «зеленого», но могут быть и для другой группы.

Моя идея заключается в том, что строки сканируются на наличие столбцов, и если количество столбцов не такое же, как в заголовке («var1», «var2» и т. Д.), То добавляются новые пустые столбцы.

Мне придется сделать это для множества разных файлов, но как только у меня появится представление о том, как это сделать, я думаю, что смогу выполнить цикл сценария bash.

[править]: Я хочу уточнить, dataset довольно большой. Как минимум с 19 переменными (столбцами). (Другой файл, где мне нужно проверить, содержит более 60 переменных)

Прямо сейчас я думаю о решении с помощью awk. Что-то вроде этого:

awk ‘{if (NF file2

Здесь следует вставить два столбца после 7-го столбца, если нет 19 столбцов (что должно быть). Попробую это позже …

Самое простое, что приходит в голову, – это разбить строки на запятые и вставить дополнительные запятые там, где их всего две. Очевидным ограничением является то, что если у вас есть запятые в фактических значениях, это сломается.

 $ cat test.csv | sed -r 's/^([^,]*),([^,]*),([^,]*)$/\1,\2, ,\3, /g' "var1", "var2", "var3", "var4", "var5" "2001", "yellow", "123", "abc", "bcdefg" "2002", "yellow", "123", "abw", "asdfkl" "2001", "green", , "abe", "2002", "green", , "abp", "2001", "blue", "324", "abx", "badsf" "2002", "blue", "231", "abl", "cpq" 

Для чего-то более общего, я бы, вероятно, написал сценарий Python (он имеет встроенные возможности CSV ). Например, это читает CSV из stdin и выводит в stdout:

 #!/usr/bin/env python import sys import csv missing = [3, 5] # 1-indexed positions of missing values missing.sort() # enforce the increasing order reader = csv.reader(sys.stdin, delimiter=',', skipinitialspace=True) writer = csv.writer(sys.stdout) header = next(reader) # get first row (header) writer.writerow(header) # write it back for row in reader: if len(row) < len(header): # row shorter than header -> insert empty strings # inserting changes indices so `missing` must be sorted for idx in missing: row.insert(idx - 1, '') writer.writerow(row) 

Преимущество использования реального анализатора CSV состоит в том, что он правильно обрабатывает запятые или кавычки в значениях и других крайних случаях. Формат вывода также будет правильным CSV, но немного отличается от того, что у вас было:

 $ cat test.csv | python test.py var1,var2,var3,var4,var5 2001,yellow,123,abc,bcdefg 2002,yellow,123,abw,asdfkl 2001,green,,abe, 2002,green,,abp, 2001,blue,324,abx,badsf 2002,blue,231,abl,cpq 

Как видите, после запятых нет лишних кавычек или пробелов. Если они вам действительно нужны, я могу посмотреть на настройку диалекта CSV для писателя.