我每次尝试读取具有不同文件结构的csv文件。我想创建一个批处理脚本,以便仅根据列名获取特定列(而不是每次更改时的列位置),并仅使用这些特定列创建新的分隔文件。例如,我们有以下csv文件数据:
Subject,ID,Error
S1,a_11,error1
S2,b_11,error2
ID列可以位于文件中的任何位置,但Error始终是最后一列。欢迎任何建议。我对批处理脚本知之甚少。真的很感谢你的帮助。提前致谢!
你的问题很不完整。有几个细节缺失,所以我必须猜测它们才能编写一个有效的批处理文件:
@echo off
setlocal EnableDelayedExpansion
if "%~1" equ "" echo Usage: %0 column names ... & goto :EOF
rem Read the header and extract column names
set /P "header=" < test.csv
set "n=0"
for %%a in (%header%) do (
set /A "n+=1, column[%%~a]=n"
)
rem Assemble output line from column names given in parameters
set "output="
:nextCol
if not defined column[%~1] echo Not such column: "%~1" & goto :EOF
set "output=!output!,%%!column[%~1]!"
shift
if "%~1" neq "" goto nextCol
rem Generate output
for /F "tokens=1-%n% delims=," %%1 in (test.csv) do echo %output:~1%
这些是缺少的细节:
这些点可以在后版中更改......
输出示例(假设批处理文件名为ExtractColumns.bat):
C:\Users\Antonio\Tests> ExtractColumns.bat Id,Subject
ID,Subject
a_11,S1
b_11,S2
无论如何,你的“问题”只是一个代码请求,所以如果你想获得进一步的支持,你应该展示你的一些努力,并发布有关已发布代码的特定疑问的问题......
我假设你使用Windows NT命令解释器(cmd.exe),因为在DOS / Win9x shell中不可能这样做。
这是一个基本代码,您可以在cmd.exe中开始配对CSV:
FOR /F "eol=; tokens=1-3 delims=," %%A IN (yourfile.csv) DO (
ECHO Subject: %%A
ECHO ID: %%B
ECHO Error: %%C
)
你应该尝试FOR /?
命令并阅读它的帮助。它会告诉您如何使用FOR /F
命令来解析文件。
使用batchfile
并不是csv文件的最佳选择。虽然它可以工作,但是如果你有一个csv字符串,像使用delims=,
这样的东西会成为问题:
"Name,Surname","ID","Error"
"Bill,Smith","ID32","Error1"
所以上面只有3个变量,但包含额外的逗号。
而是使用Powershell
$csvFilename = "D:\SomeFile.csv"
$csv = Import-Csv $csvFilename -Header @("Subject","ID","Error")
foreach ($line in $csv) {
Write-Host "Subject=$($line.Subject) ID=$($line.ID) Error=$($line.Error)"
}
您可以将其保存为.ps1
文件并在powershell中运行,或从命令行调用powershell。
Windows批处理脚本完全不适合此任务。 虽然在逗号上拆分行非常简单,但只使用cmd提供的字段内部处理引号和逗号是不可行的。
考虑使用像Perl或Python这样的脚本语言。
例如,python有csvkit包,它有一个方便的csvcut
做你想要的:
csvcut -c column_a,column_c data.csv > new.csv