0

我正在尝试将 eBay File Exchange 下载转换为我的运输软件可以读取的制表符分隔格式。

如果每一列都被引用,这将很容易——但事实并非如此。只有一些列(名称、项目列表标题等)被引用,一些引用列包含逗号。其余的都没有引号。

我需要一种在 .bat 文件中解析和转换它的方法,但是如果引用的字段也包含逗号,则使用逗号作为分隔符会拆分它们,从而给我不可用的数据。我确定有一个简单的解决方法,我就是想不通。

4

2 回答 2

2

Eric J 是正确的——用批处理解决这类问题并不简单。但这是可能的:-)

主要问题是如何区分带引号和不带引号的逗号 - jeb 在“漂亮打印”窗口%PATH% 变量中用带引号和不带引号的分号解决了类似的问题 - 如何在“;”上拆分 在 CMD 外壳中。下面的代码看起来非常不同,但基本概念是相同的。

只要所有行的长度小于约 8000 字节,下面的代码几乎适用于任何 CSV。批处理变量值限制为 8191 个字节,部分字符临时扩展为两个字节。

该代码假定 CSV 文件中没有任何现有的 TAB。

它不会修改任何现有的引号。

正如我所说,代码应该可以工作,但如果你有一个大文件,它会非常缓慢。正如 Eric J 建议的那样,使用 .NET 解决方案会更好。

@echo off
setlocal disableDelayedExpansion

set "file=optionalPathinfo\yourFile.csv"

:: Define a TAB variable
for /f "delims=" %%A in (
  'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x09"'
) do set "TAB=%%A"


:: Read each line from CSV, convert it, and write to new file with .new extension
>"%file%.new" (
  for /f usebackq^ delims^=^ eol^= %%A in ("%file%") do (
    set "line=%%A"
    call :processLine
  )
)
exit /b


:processLine
setlocal enableDelayedExpansion

:: Protect problem characters
set "line=!line:@=@A!"
set "line=!line:^=@K!"
set "line=!line:&=@M!"
set "line=!line:|=@P!"
set "line=!line:<=@L!"
set "line=!line:>=@G!"

:: Mark commas with leading caret (escape)
set "line=!line:,=^,!"

:: Remove mark from unquoted commas, but first temporarily
:: disable delayed expansion to protect any ! characters
setlocal disableDelayedExpansion
set ^"line=%line%"
setlocal enableDelayedExpansion

:: Protect remaining marked commas
set "line=!line:^,=@C!"

:: Convert remaining commas to TAB
set "line=!line:,=%TAB%!"

:: Restore protected characters
set "line=!line:@C=,!"
set "line=!line:@G=>!"
set "line=!line:@L=<!"
set "line=!line:@P=|!"
set "line=!line:@M=&!"
set "line=!line:@K=^!"
set "line=!line:@A=@!"

:: Write modified line
echo(!line!
exit /b
于 2013-12-19T05:24:37.253 回答
1

还有一个更复杂的情况:带有引号和逗号的字段也会使引号转义:

小吉姆“史密蒂”史密斯

将在 CSV 文件中表示为

“吉姆”“Smitty”“小史密斯”

这不是在批处理文件中容易解决的问题。但是,存在处理 CSV 格式的预先存在的功能,可以从任何 .NET 兼容语言(包括Powershell )中使用。如果这是一个选项,请查看

http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

有关调用 .NET 方法从 Powershell 读取 CSV 文件的信息,请查看

http://blogs.msdn.com/b/mattbie/archive/2010/02/23/how-to-call-net-and-win32-methods-from-powershell-and-your-troubleshooting-packs.aspx

于 2013-12-18T16:55:56.817 回答