我正在尝试操作下面列出的一个简单的数据系列集(输入数据(,以获得如下所示的输出csv文件。我一直在努力找出错误在哪里,以及如何编写这个脚本,但没能解决。
我想做的主要事情是找到一个非常快速的代码,它可以只从货币外汇价格中删除点,而不从日期中删除点。这个线程中提供的解决方案将需要56个小时才能在一个文件中处理660万行数据,这是一个非常长的等待时间,因为我有大约50个文件要做,所以使用这里发布的代码完成这项工作大约需要117天。由";Magoo"速度惊人,比其他发布的代码快10倍左右。我没有意识到,批处理脚本的编码方式会对完成数据操作工作所需的时间产生很大的影响。
Magoo或这个论坛上的其他人是否可以修改Magoo的代码(发布在下面(,使代码可以删除货币价格中的点,但不能删除日期中的点。请参阅下面列出的输入数据和输出数据。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:your files"
SET "destdir=u:your results"
SET "filename1=%sourcedir%q65529783.csv"
SET "outfile=%destdir%outfile.csv"
(
FOR /f "usebackqtokens=1-7delims=," %%a IN ("%filename1%") DO (
FOR /f "tokens=1-4delims=." %%s IN ("%%d.%%e") DO SET /a value=(%%s*100000^)+1%%t-(%%u*100000^)-1%%v&SET /a value=10*value+1
ECHO %%a,%%b,%%c,%%d,%%e,%%f,!value!
)
)>"%outfile%"
GOTO :EOF
输入数据:
2003.05.04,21:00,118.940,118.952,118.940,118.952,13
2003.05.04,21:01,118.961,118.967,118.958,118.967,13
2003.05.04,21:02,118.972,118.972,118.955,118.955,18
2003.05.04,21:03,118.953,118.961,118.949,118.949,21
2003.05.04,21:04,118.953,118.953,118.946,118.946,8
输出数据应该如下所示:
2003.05.04,21:00,118940,118952,118940,118952,13
2003.05.04,21:01,118961,118967,118958,118967,13
2003.05.04,21:02,118972,118972,118955,118955,18
2003.05.04,21:03,118953,118961,118949,118949,21
2003.05.04,21:04,118953,118953,118946,118946,8
只需对我上次回答中提供的代码的vbscript部分进行一些非常基本的更改,您就可以轻松地使用我在那里提供的相同批处理文件代码我真的不知道你为什么决定坚持使用批处理文件和糟糕的set /a
实现
<!-- :
@SetLocal EnableExtensions
@If Exist "usdjpy1.csv" ((For /F UseBackQTokens^=1-6Delims^=^,EOL^= %%G In (
"usdjpy1.csv")Do @For /F %%M In (
'%SystemRoot%System32cscript.exe //NoLogo "%~f0?.wsf" "%%J" "%%K"'
)Do @Echo(%%G,%%H,%%I,%%J,%%K,%%L,%%M)>"output.csv")
@Exit /B
-->
<Job><Script Language="VBScript">
i = Int(Eval(WScript.Arguments(0)-WScript.Arguments(1)))
If i = 0 Then i = 1 Else If i < 10 Then i = 10
WScript.Echo i
</Script></Job>
[Edit1/]
以下是根据您更改的标准进行的更新:
<!-- :
@SetLocal EnableExtensions
@If Exist "usdjpy1.csv" ((For /F UseBackQTokens^=1-6Delims^=^,EOL^= %%G In (
"usdjpy1.csv")Do @For /F %%M In (
'%SystemRoot%System32cscript.exe //NoLogo "%~f0?.wsf" "%%J" "%%K"'
)Do @Echo(%%G,%%H,%%I,%%J,%%K,%%L,%%M)>"output.csv")
@Exit /B
-->
<Job><Script Language="VBScript">
i = Round(Eval((WScript.Arguments(0)-WScript.Arguments(1))*1000),0)
If i = 0 Then i = 1 Else If i < 10 Then i = 10
WScript.Echo i
</Script></Job>
[Edit2/]
我添加了一些额外的代码,以允许删除小数点(本质上,我已经将所有四个字段传递到vbscript部分,并在其中将每个字段乘以1000,然后转换为整数(
<!-- :
@SetLocal EnableExtensions
@If Exist "usdjpy1.csv" ((For /F UseBackQTokens^=1-6Delims^=^,EOL^= %%G In (
"usdjpy1.csv")Do @For /F %%M In (
'%SystemRoot%System32cscript.exe //NoLogo "%~f0?.wsf" "%%I" "%%J" "%%K" "%%L"'
)Do @Echo(%%G,%%H,%%M)>"output.csv")
@Exit /B
-->
<Job><Script Language="VBScript">
Set objArgs = WScript.Arguments
For Each dblArg In objArgs
fieldVals = fieldVals&Int(Eval(dblArg * 1000))&","
Next
i = Round(Eval((WScript.Arguments(1)-WScript.Arguments(2))*1000),0)
If i = 0 Then i = 1 Else If i < 10 Then i = 10
WScript.Echo fieldVals & i
</Script></Job>
[Edit3/]
考虑到你的问题再次完全改变,并且你似乎不想要另一个基于WSH的解决方案,这里有一个快速的替代方案,如你的新数据所示,它只需删除浮点值中的小数点,这些小数点似乎都写到了小数点后三位。
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "sourcedir=u:your files"
Set "destdir=u:your results"
Set "filename1=%sourcedir%q65529783.csv"
Set "outfile=%destdir%outfile.csv"
If Exist "%filename1%" ((SetLocal EnableDelayedExpansion
For /F UseBackQTokens^=1-6*Delims^=^,EOL^= %%G In ("%filename1%") Do (
Set "}=%%I,%%J,%%K,%%L"
Echo(%%G,%%H,!}:.=!,%%M)
EndLocal)>"%outfile%")