Сортировать записи CSV - PullRequest
1 голос
/ 13 июня 2019

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

CSV-файл содержит около 22 столбцов, а столбец L (10) содержит почтовые индексы.Есть несколько записей с одинаковым почтовым индексом, и мне нужно отсортировать эти записи в порядке возрастания номеров.

Это то, что я сделал до сих пор,

for /F "tokens=1-22 delims=," %%a in (test.csv) do (
   rem Define the sorting column in next line: %%a=1, %%b=2, etc...
   set "line["%%l"]=%%d,%%f,%%l"
)

for /F "tokens=1* delims==" %%a in ('set line[') do echo %%b >> result2.txt

Это мой результат,Это удаление записей с дублированным почтовым индексом.Я должен увидеть несколько строк с одинаковым почтовым индексом, но с разными именами, конечно.

"John","Doe","12078" 
"John","Doe3","12095"  
"John","Doe5","12197"

ИЛИ %% f in (* csv) do (SET CurrentFile = %% f SET / a NumLines = 0

   For /f %%j in ('Find "" /v /c ^< !CurrentFile!') Do (
   Set /a NumLines=%%j




    (set row=%~1) & (set last=%~1)
   For /F "tokens=4-7 delims=," %%D in ('type !CurrentFile!') do (
        if not defined row (set row=%%D %%F) else (set last=%%D %%F)

    )
   echo.    
   echo. Filename: !CurrentFile! 
       echo. Record Count: !NumLines! 
       echo. First Record Name:!row! 
       echo. Last Record Name: !last! 

) >> Result.txt

) ENDLOCAL

Ответы [ 2 ]

0 голосов
/ 14 июня 2019
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q56588370.txt"
SET "outfile=%destdir%\outfile.txt"
SET "sortfile=%destdir%\sortfile.txt"

SET /a sortcol=3

(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 rem full line in %%a
 SET "fullline=%%a"
 CALL :sub %%a
)
)>"%sortfile%"

(
FOR /f "tokens=1*delims=+" %%a IN (' sort "%sortfile%"') DO (
 ECHO %%b
)
)>"%outfile%"

DEL "%sortfile%"

GOTO :EOF

:sub
IF %sortcol% neq 1 FOR /L %%z IN (2,1,%sortcol%) DO SHIFT
ECHO %1+%fullline%
GOTO :eof

Вам необходимо изменить настройки sourcedir и destdir в соответствии с вашими обстоятельствами.

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

Создает файл, определенный как %outfile%. %sortfile% - это просто временный файл с любым именем в разумных пределах.

Извлеките каждую строку вашего файла и назначьте его содержимое переменной fullline, затем выполните подпрограмму :sub для каждой строки, передав в качестве параметра всю строку. Поскольку каждая строка должна представлять собой список элементов, разделенных запятыми, который может быть либо строкой в ​​кавычках, либо строкой, которая не содержит пробелов или запятых, она может быть декодирована подпрограммой, поэтому все, что требуется, это shift параметр-list (columnrequired - 1) раз, а необходимые данные сортировки находятся в %1.

output %1, за которым следует разделитель и вся первоначально прочитанная строка (заключив в скобки серию операторов и перенаправляя, данные, которые обычно отображаются на экране, в место назначения перенаправления) во временный файл, сортируют и удаляют данные добавляется к каждой строке с использованием выбранного разделителя.

Таким образом, можно выбрать более одного столбца и обрабатывать данные по мере необходимости - например, локальные «почтовые индексы» состоят из 4 цифр (которые могут начинаться 0) и других стран. использовать другие форматы или когда-либо популярный код расширения, который может быть применен к ZIP, могут быть записаны и обработаны.

Вот мои тестовые данные:

"John","Doe","12345","moredata 1"
"John","Do, or not","12345","moredata 2"
"John","Doe 4","12344","moredata 3"
"John","Doe 5","12345","moredata 4"
"John","Doe 6","12345","moredata 5"
"John","Doe 7","12344","moredata 6"

и вывод:

"John","Doe 4","12344","moredata 3"
"John","Doe 7","12344","moredata 6"
"John","Do, or not","12345","moredata 2"
"John","Doe 5","12345","moredata 4"
"John","Doe 6","12345","moredata 5"
"John","Doe","12345","moredata 1"
0 голосов
/ 14 июня 2019
setlocal EnableDelayedExpansion

for /F "tokens=1-22 delims=," %%a in (test.csv) do (
   rem Define the sorting column in next *three lines*: %%a=1, %%b=2, etc...
   if not defined V%%~l set "V%%~l=1000"
   set /A "V%%~l+=1"
   set "line[%%~l!V%%~l!]=%%d,%%f,%%l"
)

for /F "tokens=1* delims==" %%a in ('set line[') do echo %%b >> result2.txt

Если существует несколько записей с одним и тем же почтовым индексом, то необходимо идентифицировать каждую из них. Это решение использует переменную с именем V<zip code> в качестве счетчика для каждой из записей с одинаковым почтовым индексом. Затем значение такой переменной присоединяется к самому почтовому индексу, чтобы создать уникальный ключ для каждой записи. Программа предполагает, что существует максимум 999 записей с одинаковым почтовым индексом; если этого значения недостаточно, просто добавьте ноль в строку if not defined V%%~l set "V%%~l=1000" ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...