使用具有空值的命令按三列对csv文件进行排序?

凯森

情况是这样的:

我有一个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列将包含空白。

oo
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

您将需要更改的设置sourcedirdestdir适合您的情况。

我使用了一个名为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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章