使用批处理脚本只读分隔文件中的特定列

问题描述 投票:-1回答:4

我每次尝试读取具有不同文件结构的csv文件。我想创建一个批处理脚本,以便仅根据列名获取特定列(而不是每次更改时的列位置),并仅使用这些特定列创建新的分隔文件。例如,我们有以下csv文件数据:

Subject,ID,Error

S1,a_11,error1

S2,b_11,error2

ID列可以位于文件中的任何位置,但Error始终是最后一列。欢迎任何建议。我对批处理脚本知之甚少。真的很感谢你的帮助。提前致谢!

batch-file delimited-text
4个回答
0
投票

你的问题很不完整。有几个细节缺失,所以我必须猜测它们才能编写一个有效的批处理文件:

@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%

这些是缺少的细节:

  • 输出文件中的“特定列”在批处理文件参数中给出。
  • 输入文件可能有多少列?超过9?超过26?当前代码最多只能输出到输入文件中的第9列。
  • 可能数据的列包含用引号括起来的逗号(如“Bill,Smith”,“ID32”,“Error1”)或空列(如S1,error1)?当前代码无法处理这些情况。

这些点可以在后版中更改......

输出示例(假设批处理文件名为ExtractColumns.bat):

C:\Users\Antonio\Tests> ExtractColumns.bat Id,Subject
ID,Subject
a_11,S1
b_11,S2

无论如何,你的“问题”只是一个代码请求,所以如果你想获得进一步的支持,你应该展示你的一些努力,并发布有关已发布代码的特定疑问的问题......


0
投票

我假设你使用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命令来解析文件。


0
投票

使用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。


-2
投票

Windows批处理脚本完全不适合此任务。 虽然在逗号上拆分行非常简单,但只使用cmd提供的字段内部处理引号和逗号是不可行的。

考虑使用像Perl或Python这样的脚本语言。 例如,python有csvkit包,它有一个方便的csvcut做你想要的:

csvcut -c column_a,column_c data.csv > new.csv
© www.soinside.com 2019 - 2024. All rights reserved.