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

时间:2017-12-05 15:59:03

标签: csv batch-file character

我有一个带逗号的csv文件,用于分隔值。我想通过批处理用分号替换逗号,但保留引号内的逗号。 例如:

012,ABC,"DE,FG",345

必须成为:

012;ABC;"DE,FG";345

我如何通过批处理?

3 个答案:

答案 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文件输入。唯一的限制是:

  • 从输出中删除空行(CSV应该不是问题)
  • 线长限制在8 kb左右。确切的限制取决于必须执行多少次中间替换。

答案 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"