Как проверить количество столбцов для каждой строки в CSV-файле? - PullRequest
1 голос
/ 10 ноября 2010

У меня большой файл с десятками тысяч строк, содержащих данные, разделенные | для массовой вставки в мою базу данных. Я знаю, что должно быть, скажем, 10 столбцов.

Поскольку некоторые данные могут случайно содержать разделитель |, могут возникнуть ошибки, поскольку количество столбцов для этой строки не будет совпадать.

Я пытаюсь подсчитать количество строк, содержащих более 20 столбцов, чтобы убедиться, что файл действителен:

@ECHO OFF
set /a count=0
FOR /f "tokens=10,* delims=|" %%i in (%1) DO (
  if not "%%j"=="" (
    set /a count+=1
  )
)
echo %count%
:eof

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

e.g  
    1|2|3|4|5|6|7|8|9|10 => cool, 10 columns
    1|2|3|4|5|6|7|8|almost got|you|10 => found 11 columns 
    1|2|3|4||6|7|8|got|you|10 => damn, reports as 10 columns

Как решить эту проблему, используя только командную строку / пакет Windows?

Примечание. Я не могу изменить файл, чтобы заключить данные в кавычки или что-то в этом роде.

1 Ответ

1 голос
/ 10 ноября 2010

Вы можете использовать findstr и дать ему регулярное выражение. Допустим, вы знаете, что ваша строка содержит не менее 10 столбцов, что означает, что она содержит как минимум 9 символов канала. И вы хотите найти, какие строки имеют 10 или более символов трубы. Мы можем придумать это регулярное выражение:

.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*  Line has at least 10 pipe characters, meaning
                                  some data field contains a pipe character.

Дайте это регулярное выражение findstr.

findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt

Это печатает все искаженные линии. Дайте результат этого к find /c, чтобы посчитать количество строк, которые он выплевывает.

findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt | find /c "|"

Пример data.txt:

1|2|3|4|5|6|7|8|9|10                 good - 10 columns
1|2|3|4|5|6|7|8|almost got|you|10    bad  - 11 columns
1|2|3|4||6|7|8|got|you|10            bad  - 11 columns
1|2|3|4|5|6|7|8|9||                  bad  - 11 columns
1|2|3|4|5|6|7|8|9                    good - 10 columns
1|2|3|4|5|6|7                        gotcha - less than 10 columns not detected
1|2|3|4|5|6|7|8|9|                   good - 10 columns
|||||||||                            good - 10 columns
||||||||||                           bad  - 11 columns

C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt
1|2|3|4|5|6|7|8|almost got|you|10    bad  - 11 columns
1|2|3|4||6|7|8|got|you|10            bad  - 11 columns
1|2|3|4|5|6|7|8|9||                  bad  - 11 columns
||||||||||                           bad  - 11 columns

C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt | find /c "|"
4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...