如何使用批处理脚本按列对csv进行排序?

时间:2014-03-10 16:59:45

标签: windows sorting batch-file csv

我有一个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,但它不起作用...感谢您的帮助

3 个答案:

答案 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。