如何使用批处理脚本将CSV列值拆分为其他列

时间:2016-08-05 16:58:47

标签: csv batch-file

我是批处理文件的新手,这是一个棘手的问题。在stores.csv中有一个名为' Image'它将垂直线分隔的图像URL存储为值。还有其他列称为' AltImage2',' AltImage3'等。如何将垂直线分隔的字符串拆分为以' AltImage'开头的列。对于CSV中的每一行? ' AltImage'列仅转到AltImage5,并且给定行中可能没有五个图像URL。我还想将第一张图片网址保留在'图片'如果可能的话。

标题和单行数据的示例:

Company,Title,Image,AltImage2,AltImage3,AltImage4,AltImage5
Testco,U2X40,image1.png|image2.png|image3.png

运行批处理后的所需结果:

Company,Title,Image,AltImage2,AltImage3,AltImage4,AltImage5
Testco,U2X40,image1.png,image2.png,image3.png

到目前为止,我已经尝试过这个:

for /f "tokens=3 delims=, " %%a in ("stores.csv") do (
    echo run command here "%%a"
)

但是甚至无法回显Image列中的值。

以下是使用Bash脚本的解决方案(遗憾的是我需要批处理):How do I split a string on a delimiter in Bash?

3 个答案:

答案 0 :(得分:1)

@echo off
setlocal

< stores.csv (
   rem Read and write the header
   set /P "header="
   call echo %%header%%
   rem Process the rest of lines
   for /F "tokens=1-3 delims=|" %%a in ('findstr "^"') do echo %%a,%%b,%%c
)

答案 1 :(得分:0)

我认为这会处理您的解析问题。请注意引号和usebackq选项。

for /f "skip=1 tokens=3 delims=," %%a in (stores.csv) do for /f "tokens=1-5 delims=|" %%b in ("%%a") do echo %%b %%c %%d %%e %%f

这是一个更全面的解决方案。可能有一种更优雅的方式来处理可选的逗号。并且您必须处理将输出定向到适当的地方。

@echo off
setlocal enabledelayedexpansion
echo Company,Title,Image,AltImage2,AltImage3,AltImage4,AltImage5
for /f "skip=1 tokens=3 delims=," %%a in (stores.csv) do (
    for /f "tokens=1-5 delims=|" %%b in ("%%a") do (
        set line=%%b
        if not "%%c"=="" set line=!line!,
        set line=!line!%%c
        if not "%%d"=="" set line=!line!,
        set line=!line!%%d
        if not "%%e"=="" set line=!line!,
        set line=!line!%%e
        if not "%%f"=="" set line=!line!,
        set line=!line!%%f
        echo !line!
    )
)

答案 2 :(得分:0)

逐行阅读文件并将|替换为,(您必须转义|并使用delayed expansion

@echo off
setlocal enabledelayedexpansion
(
  for /f "delims=" %%a in (old.csv) do (
    set line=%%a
    echo !line:^|=,!
  )
)>new.csv