用于将引用括起的.csv转换为固定宽度列的批处理文件

时间:2014-06-30 21:01:22

标签: batch-file

我的任务是将手持式扫描仪的数据输出传输到遗留应用程序中。扫描程序没有给我任何格式化输出的选项。

我已经研究过这个,但我的DOS脚本编写经验有限。我在你的网站上发现了这个:

Batch file convert comma delimited to fixed length

但由于引号而失败;并且它无法将填充空间填充到所需的列宽。

下面的输入文件来自扫描仪。对于遗留应用程序,我需要它所需的输出。在' |'不希望结束每一行。我用它来表示有尾随空格。输出为8个字符,一个逗号,然后是14个字符;左对齐;空间填充到右边。

我有另一个文件有三列8,14,14。

基本上,我需要从.csv到用逗号分隔的固定宽度字段。

输入:

"20009","01138913"
"20009","01138915"
"20009","01138916"
"20009","01138914"
"20009","01138918"
"20009","01138920"
"20009","01138919"

期望的输出:

20009   ,01138913      |
20009   ,01138915      |
20009   ,01138916      |
20009   ,01138914      |
20009   ,01138918      |
20009   ,01138910      |
20009   ,01138919      |

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用以下内容,对于没有引号的列,它也应该是健壮的:

@echo off
for /f "tokens=1,2 delims=," %%x in (test.csv) do call :process %%x %%y
goto :eof

:process
    set "A=%~1        "
    set "B=%~2              "
    set "A=%A:~0,8%"
    set "B=%B:~0,14%"
    (echo %A%,%B%)

这里有一些技巧。第一个for /f可用于解析CSV。我们通过将两列值传递给子例程来绕过引号。由于参数可以引用或不引用,我们使用%~1来访问它们,这会删除引号(如果存在),引号在这里没有问题。 %A%%B%设置为列值,右边有很多填充空格,后面两行用适当的填充选择值。然后我们逐个输出这些行。

要获取输出文件,只需重定向到新文件,或将>> out.txt添加到最后一行。

但是,如果可以使用其他工具,那么一定要这样做。例如。在PowerShell中,这将是相当微不足道的:

  1. 解析文件

    Import-Csv test.csv -Delimiter ',' -Header A,B |
    
  2. 使用格式字符串输出

      ForEach-Object { '{0,-8},{1,-14}' -f $_.A,$_.B } |
    
  3. 写入新文件

      Out-File out.txt -Encoding Default