我有分号分隔的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
...
答案 0 :(得分:3)
以下内容将在给定文件夹中搜索.csv
个文件。然后,它会在找到的所有.
个文件中替换任何,
.csv
,并将新文本覆盖到同一文件中。
Get-ChildItem -Path C:\Folder -Filter '*.csv' | ForEach-Object {
(Get-Content $_.FullName).Replace('.',',') | Out-File $_.FullName
}
答案 1 :(得分:3)
以下脚本构成纯batch-file解决方案:
@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} },-
)。这是batch-file代码:
1.2E-02
答案 2 :(得分:0)
您可以使用此命令:
$file = Get-Content c:\somewhere\file.csv |Out-String
$file.Replace(".",",") |Out-File c:\somewhere\file.csv