i有一个带有逗号的CSV文件,用于分离值。我想通过批处理代替逗号,但要留下引号内的逗号。因此:
012,ABC,"DE,FG",345
必须成为:
012;ABC;"DE,FG";345
我该如何通过批处理?
如果您碰巧具有jrepl.bat正则表达式文本处理实用程序(v7.9或更高版本),则可以使用:
jrepl "," ";" /p "([cq]+)|q.*?q" /prepl "$1?{$0}:$0" /f "test.csv" /o -
如果将命令放在批处理脚本中,请使用call jrepl
。
原始文件将被覆盖。如果您不想覆盖原件。
,可以将新文件名替换为-
。jrepl.bat是纯脚本(Hybrid jscript/batch),在任何Windows机器上都从XP开始运行 - 不需要第三方。EXE.exe文件。
JREPL解决方案通过以两个步骤进行替换来起作用。
1) /P
选项将每行分解为无引用的字符串和引用的字符串。/PREPL
选项将未引用的字符串传递到正常查找/更换,并保留了未引用的字符串。
2)主要查找/替换替代;
,
可以使用Jeb在" pretty Print'Windows'Windows%path%变量 - 如何拆分';';'';'';'';'';'';'';'';'';'';'';'';'';'';';';';';在CMD外壳中。尽管任何纯批处理溶液都会比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文件输入。唯一的限制是:
- 从输出中剥离了空线(CSV不应该是问题)
- 线长度限于约8 kb。确切的限制取决于必须执行多少个中间替代。
powerShell可能是更好的解决方案,但是您可以使用称为parsecsv.bat的整洁混合批处理文件。它允许您指定输入和输出定界符。输入定界符默认使用逗号。因此,您只需要指定输出定界符。
ParseCSV.bat /o:; <"file.csv" >"filenew.csv"
此可能的替代方案似乎与您提供的单行示例一起使用:
@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"