我是批处理文件的新手,这是一个棘手的问题。在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?
答案 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