如何用多个csv文件中的逗号替换点?

时间:2016-10-10 08:51:00

标签: powershell batch-file

我有分号分隔的CSV文件。一些数值以小数点存储,对于其他数据操作,我需要使用带小数点的数字。这应该对任何Win机器上的同一文件夹中的每个文件运行。有任何想法吗?

我已使用此脚本

在单个文件上成功尝试PowerShell
(Get-Content VER_ZdnSort201608-20160908210028original.csv) | ForEach-Object { $_ -replace "\.", "," } | VER_ZdnSort201608-20160908210028new.csv

但我似乎无法使用多个文件,也无需在不创建新文件的情况下替换内容。

数据如下所示:

520100;2016-08-31;3197.90;N0401
520200;2016-08-31;6406.66;N0401
520430;2016-08-31;536.40;N0401
520800;2016-08-31;1547.70;N0401
...

输出应该是这样的:

520100;2016-08-31;3197,90;N0401
520200;2016-08-31;6406,66;N0401
520430;2016-08-31;536,40;N0401
520800;2016-08-31;1547,70;N0401
...

3 个答案:

答案 0 :(得分:3)

以下内容将在给定文件夹中搜索.csv个文件。然后,它会在找到的所有.个文件中替换任何, .csv,并将新文本覆盖到同一文件中。

Get-ChildItem -Path C:\Folder -Filter '*.csv' | ForEach-Object {  
    (Get-Content $_.FullName).Replace('.',',') | Out-File $_.FullName 
}

答案 1 :(得分:3)

以下脚本构成纯解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

for %%F in (%*) do (
    for /F delims^=^ eol^= %%L in ('
        type "%%~F" ^& ^> "%%~F" rem/
    ') do (
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        >> "%%~F" echo(!LINE:.=,!
        endlocal
    )
)

endlocal
exit /B

提供CSV文件的路径作为命令行参数。假设脚本名为convert-decimal-point.bat且您的CSV文件位于D:\Data,请使用以下命令行:

convert-decimal-point.bat "D:\Data\*.csv"

以下是一个全面的解决方案,不会盲目地将每个.替换为,,但会检查每个字段是否真正包含小数(可选符号+ / {{1} },后跟任意数量的小数位,后跟-,后跟任意数量的小数位;例如.1.2-.73)或指数(小数,后跟+12.584 / E,后跟一个符号e / +,后跟一个或多个十进制数字;例如{{1} },-)。这是代码:

1.2E-02

答案 2 :(得分:0)

您可以使用此命令:

$file = Get-Content c:\somewhere\file.csv |Out-String

$file.Replace(".",",") |Out-File c:\somewhere\file.csv