заменить пробелы и пустые ячейки в файле csv

Вопрос или проблема

У меня есть CSV-файл с 7 столбцами. В нем есть пустые ячейки и пробелы между ячейками. Как я могу заменить пустые ячейки на NA и удалить лишние пробелы? Большое спасибо!

Вот как выглядит мой файл, но здесь кажется, что он изменяется при копировании и вставке.

130070078,PPW0001,1,4,4HW             ,2,15.61943874
120040039,PPW0002,0,0,                ,0,0
120040043,PPW0003,1,3,3WE             ,1,14.43394935

Ваш ответ:

sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' > file2

Чтобы получить ‘NA’ в последнем поле, если оно пусто:

sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'> file2

Вы также можете использовать :

sed 's/,,/,NA,/g' file1 | tr -d ' ' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'

Ответ αғsнιη работал для меня, но я хотел бы немного его объяснить.

Я пытался что-то вроде этого:

echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed 's/,,/,-,/g'

Что выводит

1,-,2,-,,3,-,,4,-,,-,5,-,,-,,-,,-,,-,6

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

Теперь вы могли бы сделать что-то вроде:

echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed -e 's/,,/,-,/g' -e 's/,,/,-,/g'

или

sed 's/,,/,-,/g;s/,,/,-,/g'

Что заменит все ячейки, так как вторая команда обработает те, которые пропущены, но это немного запутанно.

Команда αғsнιη делает по сути то же самое, используя метку и прыжок, о чем я не знал, что это возможно.

sed ':MYLABEL; s/,,/,-,/g; t MYLABEL;'

вывод:

1,-,2,-,-,3,-,-,4,-,-,-,5,-,-,-,-,-,-,-,-,-,6

Итак, первая часть команды создает метку.

Затем мы имеем то же замещение.

Затем у нас есть команда t, что означает переход к метке, если предыдущая команда замены была успешной.

Больше информации: http://www.grymoire.com/Unix/Sed.html#uh-59

Ответ или решение

Ваша задача заключается в обработке CSV файла, который содержит семь столбцов, с пустыми ячейками и лишними пробелами. Необходимо заменить пустые ячейки на "NA" и удалить избыточные пробелы. Давайте рассмотрим, как мы можем решить эту задачу с использованием инструментов командной строки, таких как sed и awk, которые подходят для обработки текстовых данных в Unix-подобных системах.

Теория

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

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

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

Пример

Рассмотрим ваш пример данных:

130070078,PPW0001,1,4,4HW             ,2,15.61943874
120040039,PPW0002,0,0,                ,0,0
120040043,PPW0003,1,3,3WE             ,1,14.43394935

Мы видим, что в значениях есть избыточные пробелы, и в некоторых местах отсутствуют значения между запятыми.

Применение

Для решения задачи мы можем использовать несколько подходов на основе sed и awk.

Использование sed

  1. Удаление избыточных пробелов:

    sed 's/ *,/,/g' файл.csv

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

  2. Замена пустых ячеек на "NA":

    sed 's/,,/,NA,/g' файл.csv

    Замена подряд идущих запятых (маркера пустой ячейки) на запятую, за которой следует "NA".

Чтобы объединить оба шага в один, можно использовать следующий командный сценарий:

   sed 's/ *,/,/g' файл.csv | sed 's/,,/,NA,/g' > выходной_файл.csv

Использование awk

awk может также использоваться для обработки последнего столбца, если он пуст:

   sed 's/ *,/,/g' файл.csv | sed 's/,,/,NA,/g' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}' > выходной_файл.csv

Здесь флаг -F определяет разделитель полей как запятую, а OFS устанавливает выходной разделитель полей, определяя форму вывода строки.

Заключение

Используя инструменты sed и awk, вы можете эффективно обработать CSV файл, удаляя избыточные пробелы и заменяя пустые ячейки на "NA". Это упрощает процессы анализа и интеграции, поскольку данные становятся более однородными и согласованными. Данный метод подходит для больших объемов данных, где ручная правка может быть непрактичной. Эти команды можно запустить в Unix-подобной среде, такой как Linux или MacOS, или в Windows с помощью эмуляторов терминала, таких как Cygwin или Windows Subsystem for Linux (WSL).

Оцените материал
Добавить комментарий

Капча загружается...