【发布时间】:2022-01-23 02:55:46
【问题描述】:
我已经非常努力地不问这个问题,但我一直在回过头来,因为我不确定我是否尽我所能高效地做所有事情,或者是否可能存在问题。基本上,我有一个 CSV 文件,其中包含一个数字字段,但它包含一个小数和十万分之一的值,例如15.0000。我需要做的就是将其转换为不带小数位的整数。
我遇到了related question here,但所选答案似乎让人怀疑将字符串表示直接转换为整数数据类型 - 没有解释原因。
简单地将字符串转换为
int不会可靠地工作。您需要将其转换为int32。
我没有太多运气让[System.Convert] 方法工作,或者做类似$StringNumber.ToInt32() 的事情。我意识到,一旦我将数据保存回PSCustomObject,它们就会被存储为字符串,所以归根结底,我可能会让这比我的用例更复杂,我只需要重新格式化$StringNumber...但即使这样也给我带来了一些问题。
关于为什么在我的情况下强制转换不是可靠或更好的方法来处理这个问题有什么想法吗?
我尝试过的示例:
PS > $StringNumber = '15.0000'
PS > [Convert]::ToInt32($StringNumber)
#MethodInvocationException: Exception calling "ToInt32" with "1" argument(s): "Input string was not in a correct format."
PS > [Convert]::ToInt32($StringNumber, [CultureInfo]::InvariantCulture)
#MethodInvocationException: Exception calling "ToInt32" with "2" argument(s): "Input string was not in a correct format."
PS > $StringNumber.ToInt32()
#MethodException: Cannot find an overload for "ToInt32" and the argument count: "0".
PS > $StringNumber.ToInt32([CultureInfo]::InvariantCulture)
#MethodInvocationException: Exception calling "ToInt32" with "1" argument(s): "Input string was not in a correct format."
PS > $StringNumber.ToString("F0")
#MethodException: Cannot find an overload for "ToString" and the argument count: "1".
PS > $StringNumber.ToString("F0", [CultureInfo]::CurrentCulture)
#MethodException: Cannot find an overload for "ToString" and the argument count: "2".
PS > "New format: {0:F0}" -f $StringNumber
#New format: 15.0000
所以基本上我想出的是:
- 2014 年有人说将我的
string转换为int不会可靠地工作,即使看起来 Cast operator 实际上正在执行转换 -
ToInt32方法不喜欢以小数点作为输入的字符串 - 显然
String.ToStringMethod没用 - 感谢
String.ToString和processing order of composite formatting,我的字符串表示的简单“重新格式化”将不起作用
总结:有没有办法安全地将我的$StringNumber 转换成一个整数,如果是这样,在大型数据集上最有效的方法是什么?
奖励挑战:
如果有人可以使用ForEach magic method 完成这项工作,那么我会给你买啤酒。这是一些不起作用的伪代码,但如果它起作用会很棒。据我所知,在设置 string property 的值时无法引用集合中的当前项目@
#This code DOES NOT work as written
PS > $CSVData = Import-Csv .\somedata.csv
PS > $CSVData.ForEach('StringNumberField', [int]$_.StringNumberField)
【问题讨论】:
-
铸造
[int]应该不是问题...至少在你遇到[decimal]::MaxValue或[long]::MaxValue之前 -
@SantiagoSquarzon 是对的。但是你也可以通过艰难的方式做到这一点。
$d = [Convert]::ToDecimal($StringNumber, [CultureInfo]::InvariantCulture) [System.Decimal]::ToInt32($d)
标签: powershell