3

У меня есть девять столбцов в моем текущем файле .csv, однако 2-й и 3-й столбцы пустые, и я хочу избавиться от них. Есть ли способ использовать пакетные команды для удаления этих пустых столбцов из моего .csv или экспортировать новый .csv без этих пустых столбцов?

4 ответа4

3

Вы не указали, какая ОС. Если у вас есть cut , используйте это.

cut -d',' -f1,4-9

-d устанавливает разделитель, в данном случае , Поскольку запятая не является специальным символом, вы можете опустить кавычки.
-f выбирает поля, в данном случае поля 1 и поля с 4 по 9 (пропуская поля 2 и 3).

Testfile "example.cvs"
foo1,   ,   , ba1, baz1, blah1, wibble1, wubble1
foo2,   ,   , ba2, baz2, blah2, wibble2, wubble2
foo2,   ,   , ba3,     , blah3, wibble3, wubble3
foo2,   ,   , ba4, baz4, blah4, wibble4, wubble4

Фактический тест команды:

> cut -d',' -f1,4-9 example.cvs

foo1, ba1, baz1, blah1, wibble1, wubble1
foo2, ba2, baz2, blah2, wibble2, wubble2
foo2, ba3,     , blah3, wibble3, wubble3
foo2, ba4, baz4, blah4, wibble4, wubble4

Cut поставляется с предустановленными большинством операционных систем (например, OS/X, дистрибутивы Linux, BSD, Solaris, ...; почти все, кроме DOS и Windows).

Если у вас есть Windows, вы можете:

  1. Откройте файл CVS в электронной таблице (например, OpenOffice Calc или MS Excel), удалите два столбца и сохраните файл. Трудно автоматизировать, поэтому используйте только, если вам нужно сделать это один раз или редко.
  2. или загрузите инструменты Unix для Windows и поместите команду cut в командный файл.
2

For /F способен анализировать файл .csv. В одну строку для запуска прямо из командной строки:

for /F "tokens=1,2,3* delims=," %i in (input.csv) do @echo %i,%l>>output.csv

Эта строка обходит строку input.csv для строки и, используя запятую в качестве разделителя, сохраняет первое значение в %i , второе в %j , третье в %k и остальную часть строки (используя звездочку в списке токенов ) в %l . Распечатывая все значения, кроме второго и третьего, вы эффективно убираете их.

Однако for /F не считает пустые строки токенами, поэтому команда не может различить две последующие запятые и одну. Это решение работает, если пустые столбцы имеют пробельные символы, но в противном случае могут пропустить неправильные столбцы.

Чтобы обойти это ограничение, мы можем написать пакетный файл, который использует замену строки для вставки пробела между двумя последующими запятыми. Эта замена выполняется дважды, чтобы справиться с возможностью трех запятых. Цитаты в ^"!line!^" должны указывать for /F должен работать со строкой вместо файла и экранироваться для предотвращения !line! быть оцененным как литеральная строка вместо переменной.

@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (input.csv) do (
    set line=%%a
    set line=!line:,,=, ,!
    set line=!line:,,=, ,!
    for /F "tokens=1,2,3* delims=," %%i in (^"!line!^") do (
        echo %%i,%%l>>output.csv
    )
)

В результате получается новый файл .csv, идентичный input.csv, за исключением пропущенных второго и третьего столбцов.

0

Если вы работаете в Windows, у файла нет заголовков, и у вас есть доступ к Powershell, вы можете использовать что-то вроде следующего:

Импорт-CSV.\InFile.csv -Header col1, col2, col3, col4, col5 -Delimiter ',' | Select-Object col1, col4, col5 | ConvertTo-Csv | Выберите -skip 2>.\OutFile.csv

Так что:

  • Импортирует CSV.
  • Назначает имена столбцов для справки.
  • Выбирает все 5 столбцов, кроме 2 и 3.
  • Преобразует обратно в правильный CSV.
  • Выбирает этот CSV, начиная со строки 2 (чтобы пропустить назначенные заголовки столбцов)
  • Передает это в выходной файл.
0

Я хотел бы открыть файл CSV в Блокноте (или любой другой текстовый редактор) и поиск и замена ,, , Это, конечно, предполагает, что данные в ваших столбцах не имеют ,, в них.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .