案件如下:
我有一个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列将包含空的。
发布于 2016-04-11 08:48:10
如果输入文件和输出文件不同的话,只需使用1行Unxutil命令,
gawk -F"," "{print $1,$2,$3,$4,$5,$6}" input.csv|sort -gk1,3|sed "s/ /,/g";"s/$/\r/">output.csv例如,如果输出要直接输入文件,则输入.csv文件可以通过将自身拖动到批处理文件来获得结果,
sed -i "s/,/ /g" "%~1"
sort -gk1,3 "%~1" -o"%~1"
sed -i "s/ /,/g";"s/$/\r/" "%~1"
exit /b每一列都可以保持原样。
发布于 2016-04-11 17:43:43
下面的脚本能够满足您的请求(让我们称之为sort-csv.bat):
@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Define constants:
set "INFILE=%~1"
set "OUTFILE=%~2"
set "TEMPFILE=%TEMP%\%~n1_interim_to_sort%~x1"
set /A MAXWIDTH=10
if not exist "!INFILE!" exit /B 1
if not defined OUTFILE set "OUTFILE=%~dpn1_sorted%~x1"
set "PADZEROS="
for /L %%$ in (1,1,%MAXWIDTH%) do set "PADZEROS=!PADZEROS!0"
> "!TEMPFILE!" (
for /F "delims=" %%# in ('findstr /N /R "^^" "!INFILE!"') do (
set "LINE=%%#" & set "LINE=!LINE:*:=!"
for /F "delims=:" %%a in ("%%#") do set "LNUM=!PADZEROS!%%a"
for /F "tokens=1,3 delims=," %%A in (""!LINE:^,^=","!"") do (
set "ITEM1=!PADZEROS!%%~A" & set "ITEM1=!ITEM1:~-%MAXWIDTH%!"
set "ITEM2=!PADZEROS!%%~B" & set "ITEM2=!ITEM2:~-%MAXWIDTH%!"
echo(!ITEM1!;!ITEM2!;!LNUM:~-%MAXWIDTH%!_!LINE!
)
)
)
> "!OUTFILE!" (
for /F "tokens=1,* delims=_" %%I in ('sort "!TEMPFILE!"') do (
echo(%%J
)
)
> nul 2>&1 del "!TEMPFILE!"
endlocal
exit /B要使用这个批处理文件,提供输入和输出路径/文件作为命令行参数:
排序-csv.bat“输入-file.csv”“输出-file.csv”
这背后的主要思想是用","替换每一个分隔符",",并将""中的每一行封装起来,因此每个项目都被""括起来;例如,像1,2,,4这样的行变成"1","2","","4"。这避免了相邻的分隔符,,,因此可以使用以,作为分隔符的for /F循环来获取项;使用for /F变量的~修饰符来删除周围的""。
对于排序,使用一个临时文件,其中包含以分号分隔的列作为前缀的原始行,以及以前导零填充方式排列的原始行号。因此,您的输入文件如下:
0005002200;0000002797;0000000001_5002200,25081,0000002797,6,,2014/06/05 0005001111;0000002790;0000000002_5001111,25081,0000002790,,2014/06/05 0005004901;0000002799;0000000003_5004901,00081,0000002799,5,,2014/06/05 0005004901;0000002796;0000000004_5004901,00081,0000002796,5,,2014/06/05
然后将该文件输入到sort命令中,该命令的输出由另一个for /F循环捕获,该循环切断前缀,即所有到_字符的所有内容。
https://stackoverflow.com/questions/36542742
复制相似问题