除了引号中的逗号外,如何用分号替换逗号



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"

最新更新