我有一个带逗号的csv文件,用于分隔值。我想通过批处理用分号替换逗号,但保留引号内的逗号。 例如:
012,ABC,"DE,FG",345
必须成为:
012;ABC;"DE,FG";345
我如何通过批处理?
答案 0 :(得分:2)
如果您碰巧拥有JREPL.BAT regular expression text processing utility (v7.9 or later),那么您可以使用:
jrepl "," ";" /p "([\c\q]+)|\q.*?\q" /prepl "$1?{$0}:$0" /f "test.csv" /o -
如果将命令放在批处理脚本中,请使用call jrepl
。
原始文件将被覆盖。如果您不想覆盖原始文件,可以用-
替换新文件名。
JREPL.BAT是纯脚本(混合JScript /批处理),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方.exe文件。
JREPL解决方案的工作原理是分两步执行替换。
1) /P
选项将每一行分为不带引号的字符串和带引号的字符串。 /PREPL
选项将未加引号的字符串传递给普通的FIND / REPLACE,并且不加引号的字符串保持不变。
2)主要的FIND / REPLACE将;
替换为,
使用jeb在'Pretty print' windows %PATH% variable - how to split on ';' in CMD shell开发的技术变体,可以使用纯批次可靠地实现此目的。虽然任何纯批处理解决方案都会比JREPL.BAT,ParseCSV.bat或PowerShell解决方案等混合解决方案慢得多。
这是一个源自jeb技术的批处理脚本 - 只需将CSV文件的名称作为唯一参数传递。原始文件将被覆盖。修改脚本以将输出写入新文件应该是微不足道的。请参阅jeb的帖子,了解这种看似神奇的技术是如何运作的。
@echo off
setlocal disableDelayedExpansion
>"%~1.new" (
for /f usebackq^ delims^=^ eol^= %%A in ("%~1") do (
set "ln=%%A"
call :repl
)
)
move /y "%~1.new" "%~1" >nul
exit /b
:repl
set "ln=%ln:"=""%"
set "ln=%ln:^=^^%"
set "ln=%ln:&=^&%"
set "ln=%ln:|=^|%"
set "ln=%ln:<=^<%"
set "ln=%ln:>=^>%"
set "ln=%ln:,=^,^,%"
set ln=%ln:""="%
set "ln=%ln:"=""%"
set "ln=%ln:,,=;%"
set "ln=%ln:^,^,=,%"
set "ln=%ln:""="%"
setlocal enableDelayedExpansion
echo(!ln!
exit /b
该脚本应该能够处理几乎任何有效的CSV文件输入。唯一的限制是:
答案 1 :(得分:1)
Powershell可能是更好的解决方案,但您可以使用名为ParseCSV.bat的整齐混合批处理文件。它允许您指定输入和输出分隔符。输入分隔符默认使用逗号。所以你只需要指定输出分隔符。
ParseCSV.bat /o:; <"file.csv" >"filenew.csv"
答案 2 :(得分:1)
这种可能的选择似乎适用于您提供的单行示例:
@Echo Off
If Not Exist "file.csv" Exit/B
(For /F "Delims=" %%A In ('FindStr "^" "file.csv"') Do (Set "$="
For %%B In (%%A) Do Call Set "$=%%$%%;%%B"
Call Echo %%$:~1%%))>"filenew.csv"