我的任务是将手持式扫描仪的数据输出传输到遗留应用程序中。扫描程序没有给我任何格式化输出的选项。
我已经研究过这个,但我的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 |
非常感谢任何帮助。
答案 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中,这将是相当微不足道的:
解析文件
Import-Csv test.csv -Delimiter ',' -Header A,B |
使用格式字符串输出
ForEach-Object { '{0,-8},{1,-14}' -f $_.A,$_.B } |
写入新文件
Out-File out.txt -Encoding Default