情况是这样的:
我有一个6列的csv文件,没有标题,如下所示:
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
提供参数concatenated_column1_column3 line_number originaldataline的过程处理该行
在中:process
,将1000000000添加到其中的行号%2
,然后发送
concatenated_column1_column3_modified_line_number Spaceoriginaldataline
所以发送的行将是
500220000000027971000000001 5002200,25081,0000002797,6,,2014/06/05
空格之前的线段是固定长度的。
完成后,对临时文件进行排序,并在第一个空格之后报告零件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句