Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何在多个csv文件中用逗号替换点?_Powershell_Batch File - Fatal编程技术网

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

Powershell 如何在多个csv文件中用逗号替换点?,powershell,batch-file,Powershell,Batch File,我有分号分隔的CSV文件。有些数值是用小数点存储的,对于其他数据处理,我需要使用带小数点逗号的数字。在任何Win机器上,应针对同一文件夹中的每个文件运行此操作。有什么想法吗 我已使用此脚本在单个文件上成功尝试了PowerShell (Get-Content VER_ZdnSort201608-20160908210028original.csv) | ForEach-Object { $_ -replace "\.", "," } | VER_ZdnSort201608-201609082100

我有分号分隔的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
...
输出应如下所示:

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
...

您可以使用以下命令:

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

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

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

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

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

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
对于%%F in(%*)do(
对于/F delims^=^eol^=%%L英寸('
键入“%%~F”^&^>“%%~F”rem/
""做"(
设置“行=%%L”
setlocal EnableDelayedExpansion
>>“%%~F”回显(!行:.=,!
端部
)
)
端部
退出/B
提供CSV文件的路径作为命令行参数。假设脚本名为
convert decimal point.bat
,并且CSV文件位于
D:\Data
,请使用以下命令行:

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

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

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_SEARCH=。”&rem/(要搜索的小数点)
设置“_REPLAC=,”&rem//(替换小数点)
设置“_SEPCHR=;”&rem/(字段分隔符)
rem//在此处预定义全局变量:
设置“$HEADER=”&rem/(设置为忽略第一行的内容)
对于%%F in(%*)do(
对于/F delims^=^eol^=%%L英寸('
键入“%%~F”^&^>“%%~F”rem/
""做"(
设置“COLL=%\u SEPCHR%”和设置“LINE=%%L”
setlocal EnableDelayedExpansion
设置“行=!行:=”!^”
如果“!LINE:*=!”==“!LINE!”(
如果“!LINE:?=!”=“!LINE!”(
对于(“!行:%\u SEPCHR%=”“!”)中的%%I,请执行以下操作(
端部
设置“项=%%~I”
调用:处理项目
setlocal EnableDelayedExpansion
对于/F“delims=“%%C in(^”“!COLL!!ITEM!%\u SEPCHR%”中的项目,请执行以下操作(
端部
设置“COLL=%%~C”
setlocal EnableDelayedExpansion
)
)
)否则设置“COLL=%\u SEPCHR%!LINE!%\u SEPCHR%”
)否则设置“COLL=%\u SEPCHR%!LINE!%\u SEPCHR%”
设置“COLL=!COLL:”“=!^”
>>“%%~F”回音(!COLL:~1,-1!
端部
设置“$HEADER=”
)
)
端部
退出/B
:进程rtn\u字符串参考\u字符串
setlocal EnableDelayedExpansion
设置“#RET=%~1”
设置“STR=!%~2!”
如果未定义$HEADER(
如果定义STR(
如果“!STR:%\u REPLAC%=!”=“!STR!”(
设置“CHK=!STR:*%\u SEARCH%=!%\u SEARCH%”
设置“CHK=!CHK:%\u SEARCH%=!”
如果未定义CHK(
rem//根据需要调整正则表达式:
(回声(“!STR!”|>numfindstr/R)^
/C:“^\”[0-9]*\%\u搜索%[0-9]*\”$”^
/C:“^\”[+-][0-9]*\%\u搜索%[0-9]*\”$”^
/C:“^\”[0-9]*\%\U搜索%[0-9]*[Ee][+-][0-9][0-9]*\”$”^
/C:“^\”[+-][0-9]*\%\u SEARCH%[0-9]*[Ee][+-][0-9][0-9]*\“$”^
) && (
设置“STR=!STR:%\u SEARCH%=%\u REPLAC%!”
)
)
)
)
)
对于/F“delims=“%%S in(^”“!STR!”^”)do(
端部
设置“%#RET%=%%~S”
)
退出/B

此解决方案似乎不起作用,它使Excel triing打开CSV,但没有转换