情况是这样的:
我有一个csv文件,有6列,没有标题,如下所示:
5002200,25081,0000002797,6,,2014/06/05
5001111,25081,0000002790,,,2014/06/05
5004901,00081,0000002799,5,,2014/06/05
5004901,00081,0000002796,5,,2014/06/05
我想要的输出在排序后显示如下:
5001111,25081,0000002790,,,2014/06/05
5002200,25081,0000002797,6,,2014/06/05
5004901,00081,0000002796,5,,2014/06/05
5004901,00081,0000002799,5,,2014/06/05
@echo off
if not exist %1 goto :EOF
setlocal
for /F "tokens=1-6 delims=," %%a in (%1) do set "a[%%b,%%c,%%a,%%d,%%e,%%f]=[]"
break > %1
for /F "tokens=2-7 delims=[,]=" %%a in ('set a[') do echo %%c,%%a,%%b,%%d,%%e,%%f>> %1
endlocal
问题是缺少空值。有什么想法吗?
我的算法是对第一列和第三列排序,然后显示为原始位置。但如果有任何空值(如第4列或第5列),它将丢失。
第一列总是包含7个长度。
只有第4列或第5列将包含空。
最佳答案
sort /+8 infilename >outfilename
会做你想做的事。如果你能解释清楚你的排序算法是什么,我们就能构建一个更合适的系统。
@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q36542742.txt"
SET "outfile=%destdir%\outfile.txt"
SET "tempfile=%destdir%\tempfile.txt"
DEL "%tempfile%" >NUL 2>NUL
(
:: first step - number each line, number to %%a, line to %%b
FOR /f "skip=1tokens=1*delims=[]" %%a IN ('find /n /v "" "%filename1%"') DO (
REM tokenise line - required parts to %%p, %%q
FOR /f "tokens=1,3delims=," %%p IN ("%%b") DO (
REM construct sort-record
CALL :process %%p%%q %%a "%%b"
)
)
FOR /f "tokens=1*delims= " %%a IN ('sort "%tempfile%"') DO ECHO(%%b
)>"%outfile%"
DEL "%tempfile%" >NUL 2>NUL
GOTO :EOF
:: First parameter: primary sort-criterion (fixed-length)
:: Second : secondary sort-criterion (leadin-zero-suppressed numeric)
:: Third : quoted data
:process
SET /a $line=1000000000+%2
>>"%tempfile%" ECHO(%1%$line% %~3
GOTO :EOF
您需要更改
sourcedir
和destdir
的设置以适应您的环境。我在测试中使用了一个名为
q36542742.txt
的文件,其中包含了您的数据。生成定义为%outfile%的文件
tempfile
可以设置为您喜欢的任何设置。首先,通过
find
发送文件,查找不包含任何内容的行并对它们进行编号。每条线都会变成[number]originallinedata
通过使用每一行以数字开头的事实在
[]
上标记,%%a
将被设置为行号,%%b
将被设置为行数据。重新处理行数据,使用
,
标记并选择标记1和3。两个字段的长度都是固定的,第二个标记不能为空。通过
:process
过程处理该行,提供串接的参数'u column1_column3 line_number originaldataline在
:process
中,将100000000添加到%2
中的行号,然后发送连接的第1列第3列修改的第4行
所以发来的电话是
500220000000027971000000001 5002200,25081,0000002797,6,,2014/06/05
空间前面的直线部分是固定长度。
完成后,对临时文件进行排序,并在第一个空格后报告零件。