如何在PowerShell中将字符串转换为双精度?
我在PowerShell中有一个脚本,用于从CSV导入数据。我收到一个错误如何在PowerShell中将字符串转换为双精度?,powershell,type-conversion,Powershell,Type Conversion,我在PowerShell中有一个脚本,用于从CSV导入数据。我收到一个错误 无法将值“日记账金额”转换为类型“System.Double”。错误:“输入字符串的格式不正确。” 位于C:\TestPowerShell\TestPowerShell1.ps1:98 char:1 +$JournalAmount=[double]$\.PSObject.Properties['Journal Amount'].Va。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
无法将值“日记账金额”转换为类型“System.Double”。错误:“输入字符串的格式不正确。” 位于C:\TestPowerShell\TestPowerShell1.ps1:98 char:1 +$JournalAmount=[double]$\.PSObject.Properties['Journal Amount'].Va。。。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:InvalidArgument:(:)[],运行时异常 +FullyQualifiedErrorId:InvalidCastFromStringToDouble或Single
这是我的密码: 这解决了问题:
$JournalAmount = $JournalAmount -as [double]
$JournalAmount = $_.PSObject.Properties['Journal Amount'].Value
回答所问问题:
- 将字符串强制转换为
-正如您自己尝试的那样,确实有效,但前提是该字符串被识别为(浮点)数字[double]
- 注意事项:由于PowerShell的强制转换是区域性不变的,因此只有
被识别为小数点,并且
始终被解释为数千分组分隔符,
- 要敏感地分析区域性,请使用
根据当前区域性的规则进行分析(如[double]::parse($string)
中所反映);传递一个$PSCulture
实例作为第二个参数,以根据给定区域性的规则进行解析(例如,要根据法国区域性的规则进行解析,请使用[cultureinfo]
)[double]::parse($string,[cultureinfo]'fr fr')
- 注意事项:由于PowerShell的强制转换是区域性不变的,因此只有
- 如果无法识别字符串值,可以使用以下方法之一来处理该情况:
- 使用处理错误;e、 例如,默认为
:0
[double]$double=尝试{$string}捕获{0}
- 使用
,返回指定类型的实例,或者如果转换失败,-as
:$null
$double=$string-as[double];如果($null-eq$double){…}
- 使用处理错误;e、 例如,默认为
至于你所尝试的: 正如所指出的,问题的可能原因是CSV文件本身有一个标题行,但您也通过
-header
参数提供了标题
这将导致CSV文件的标题行被误读为第一个数据行,结果是,Import CSV
返回的第一个对象包含列(标题)名称作为属性值-这将导致[double]
转换失败,因为您正在有效地执行以下操作:[double]“日记账金额”
因此:
- 在
调用中省略导入Csv
参数-Header
- 作为优化,使用标准点表示法简化属性值检索;只需使用引号指定属性名称
,因为它包含一个空格:日记账金额
您的CSV文件是否在第一行已有标题?当您使用
导入Csv
指定-Header$Header
时,它将所有行解释为数据(包括第一行),这将解释您在“日记账金额”列中获取值“日记账金额”)。您是否尝试将未转换的值写入控制台?在发生错误的行之前添加一行,如Write Host$\.PSObject.Properties['Journal Amount'].Value
,这可能有助于您理解该值无法转换为Double@MatiasR.Jessen…是的,我的csv文件在第一行已经有一个头。我应该用什么来代替-Header$Header?请允许我给你给新来者的标准建议:如果你有答案,你将通过向未来的读者展示解决问题的方法来帮助他们。要接受答案,请单击大标题✓ 答案左侧大数字下方的符号(您将获得2点声誉积分)。如果你至少有15个声望点,你也可以投票给其他有用的答案(也可以选择被接受的答案)。如果你的问题还没有解决,提供反馈,或者,如果你自己找到了解决方案,我不认为这解决了问题,它只是隐藏了错误。如果$JournalAmount
没有预先定义的值,则第一条语句是有效的no-op。第二条语句完全否定第一条语句的任何效果,只需将字符串值存储在$JournalAmount
中。您可能正在考虑通过将“cast”放在变量名的左侧来约束变量的类型:[double]$JournalAmount=$\u.PSObject.Properties['Journal Amount'].Value
;然而,这对你的情况没有帮助。
$JournalAmount = $JournalAmount -as [double]
$JournalAmount = $_.PSObject.Properties['Journal Amount'].Value
Import-CSV $FileBrowser.FileName | # !! No -Header argument
ForEach-Object {
# Simpler and more efficient than:
# $JournalAmount = [double] $_.PSObject.Properties['Journal Amount'].Value
$JournalAmount = [double] $_.'Journal Amount'
}
# ...