如何解决批处理文件:从.csv文件读取浮点值
我已经制作了一个读取.csv文件的批处理文件。然后,它继续从特定列(在本例中为第4列)中获取值并找到最大值。该脚本可以很好地处理整数,但是一旦我尝试传递带有浮点数的.csv文件,该脚本只会读取第一个数字。即1.546 = 1,0.896 = 0,等等...
我如何正常读取浮点数?在这种情况下,至少要有2个精度点(尽管实际的.csv文件中的值可以达到6个精度点)
要注意的另一件事是,它会打印出3次“缺失运算符”。我认为这可能是由于间距所致,但不确定在哪里。
脚本如下:
@echo off
set cur=0
set max=0
for /f "usebackq tokens=1-4 delims=," %%a in ("sample.csv") do (call :func "%%d")
echo Max is %max%
goto :here
:func
set /a cur=%1
if %cur% gtr %max% (set /a max=%cur%)
goto :eof
:here
pause
这是sample.csv,效果很好:
1,2,3,5,6,7,12.3,9,10,11,11.4,13,14,15,10.1,
为了测试代码,我还添加了一些逗号。
解决方法
如评论中所述,您可以使用powershell来完成此任务。这是一个基本想法。
对于示例文件内容:
1,2,3,5,6,7,12.3,9,10,11,11.4,13,14,15,10.1,
您可以使用类似的内容:
Import-Csv -Path ".\sample.csv" -Header ("A","B","C","D","E") | Sort-Object { [Single]$_.E } -Descending | Select-Object -First 1 -ExpandProperty E
应该返回:
12.3
正如您在上面看到的那样,因为您没有提供标题记录,所以我必须创建一些记录以标识我的目标字段。但是,如果您已经知道标题字段,则可以稍微简化一下代码。
对于示例文件内容:
This,Is,My,Actual,Header,Record,1,
您只需根据其标题值名称来命名字段,例如:
Import-Csv -Path ".\sample.csv" | Sort-Object { [Single]$_.Header } -Descending | Select-Object -First 1 -ExpandProperty Header
应该再次返回:
12.3
,
如果您要进行实际计算,那么在使用分数时,我不建议为此使用batch-file
,但是为了简单地测试最高值,我们可以将字符串.
拆分为任意一方。不过,您仍然不能使用set /a
使其成为实际的整数:
@echo off & setlocal enabledelayedexpansion
set num=0 & set frac=0
for /f "usebackq tokens=1-4 delims=," %%a in ("sample.csv") do (
for /f "tokens=1* delims=." %%i in ("%%~d") do (
if not "%%j" == "" if %%i gtr !num! (
set "num=%%i"
set "max=%%~d"
)
if %%i geq !num! if %%~j gtr !frac! (
set "frac=%%~j"
set "max=%%~d"
)
)
)
echo Max is %max%
pause
根据您对~
的评论,此处摘录自for /?
In addition,substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:
%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
%~$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search,then this modifier expands to the
empty string
The modifiers can be combined to get compound results:
%~dpI - expands %I to a drive letter and path only
%~nxI - expands %I to a file name and extension only
%~fsI - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
environment variable for %I and expands to the
drive letter and path of the first one found.
%~ftzaI - expands %I to a DIR like output line
In the above examples %I and PATH can be replaced by other valid
values. The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers,which are not case sensitive.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。