我有一个csv文件,格式如下:
COLUMN1,COLUMN2,COLUMN3
2,1,0
1,0,0
3,2,0
1,4,1
4,3,0
1,1,4
5,6,0
6,5,0
我想使用bat文件按第1列和第3列对其进行排序。我想得到的结果是:
COLUMN1,COLUMN2,COLUMN3
1,0,0
1,4,1
1,1,4
2,1,0
3,2,0
4,3,0
5,6,0
6,5,0
在unix中,这可以使用sort -n -k1,1 -k3,3 xx.csv>来完成。 sorted.csv。 我试着排序/ + 1 / + 3 xx.csv>在Windows中的sorted.csv,但它不起作用...感谢您的帮助
答案 0 :(得分:1)
也许这是实现这一目标的最简单,最快捷的方式:
@echo off
setlocal
set /P "header=" < input.txt
echo %header%
for /F "skip=1 tokens=1-3 delims=," %%a in (input.txt) do set a[%%a,%%c]=%%b
for /F "tokens=2-4 delims=[,]=" %%a in ('set a[') do echo %%a,%%c,%%b
输出:
COLUMN1,COLUMN2,COLUMN3
1,0,0
1,4,1
1,1,4
2,1,0
3,2,0
4,3,0
5,6,0
6,5,0
以前的程序假设没有具有相同COLUMN1和COLUMN3的记录,并且列的内容只是一位数。如果需要,可以修复这些限制。
答案 1 :(得分:0)
可能有更优雅和强大的解决方案,但这是我的5分钟解决方案。
@echo off
> sorted.csv set /p "=" <nul
> unsorted.tmp set /p "=" <nul
for /f "delims=" %%A in (unsorted.csv) do for /f "tokens=1,3 delims=," %%B in ("%%~A") do >>unsorted.tmp echo %%B,%%C,%%A
sort unsorted.tmp > sorted.tmp
for /f "tokens=2,* delims=," %%A in (sorted.tmp) do >>sorted.csv echo %%B
del unsorted.tmp
del sorted.tmp
这将获取第一列和第三列,将它们预先添加到行的开头,对文件进行排序,然后删除添加的列。请注意,sort命令会在字母前对数字进行加权。
输出
1,0,0
1,4,1
1,1,4
2,1,0
3,2,0
4,3,0
5,6,0
6,5,0
COLUMN1,COLUMN2,COLUMN3
答案 2 :(得分:0)
@ECHO OFF
SETLOCAL
SET "outfile=sorted.csv"
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
SET "header="
(
FOR /f "delims=" %%a IN (xx.csv) DO (
IF DEFINED header (
CALL :proc %%a
) ELSE (SET header=Y&>%outfile% ECHO(%%a)
)
)>"%tempfile%a"
FOR /f "tokens=2delims=#" %%a IN ('sort ^<"%tempfile%a"') DO >>%outfile% ECHO(%%a
del "%tempfile%a"
GOTO :EOF
:proc
SET /a c1=%1+1000000000
SET /a c3=%3+1000000000
ECHO %c1% %c3%#%1,%2,%3
GOTO :eof
我假设除了标题之外,您的数据是全数字和3列。
您没有指定所涉及的数字是否会超过9,或者如果它们是这样,您是否需要列的大小排序顺序。
我假设要按照数量级排序三列,第1列然后是第3列,数据是全数字的,没有负数。所涉及的数字都小于1000000000。