首页 > 解决方案 > 对 CSV 记录进行排序

问题描述

我正在尝试使用批处理脚本对特定列上的 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"

OR %%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

) 本地化

标签: csvbatch-filecmd

解决方案


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"一行中添加一个零...


推荐阅读