PowerShell 和 CSV:阻止 CSV 将文本数据转换为科学记数法

Posted

技术标签:

【中文标题】PowerShell 和 CSV:阻止 CSV 将文本数据转换为科学记数法【英文标题】:PowerShell and CSV: Stop CSV from turning text data into Scientific Notation 【发布时间】:2021-08-27 13:42:33 【问题描述】:

我有一列包含字母数字组合的 CSV 列。 稍后我将通过导入数据在 PowerShell 脚本中使用此 csv 文件。

示例:1A01、1C66、1E53。 现在,在输入这​​些值之前,我确保将列格式化为文本。 现在起初它有效。我输入数据,保存。我在 PowerShell 中进行测试以导入它并 所有数据均显示有效,包括 1E53。但是可以说我稍后再次编辑文件以添加数据,然后保存并关闭。我重新导入 PowerShell,1E53 以 1.00E+53 的形式出现。我怎样才能永久防止这种情况?请注意,该列充满了代码,并且有很多#E##。

【问题讨论】:

PowerShell 使用 Import-CsvExport-Csv 不会改变值。我怀疑你是在 Excel 中打开 csv 文件,然后就会发生转换。如果您有这样的 CSV 文件,并且不希望 Excel 弄乱您的字段格式,请在这些字段值前面加上一个 TAB 字符(所以用 $value = "`t$value" 更改该列中的每个值) 我们还没有收到您的来信.. 任何给定的答案是否解决了您的问题?如果是这样,请通过单击左侧的大复选标记图标 考虑accepting。这将帮助其他有类似问题的人更轻松地找到它。 【参考方案1】:

您的问题不在于 PowerShell,而在于 Excel。作为演示,请使用1E53 并将其输入 Excel,然后将该 excel 文件另存为 CSV 文件。您会看到该值现在更改为1.00E+53

如何解决这个问题?

有几种方法可以禁用科学记数法:

https://superuser.com/questions/452832/turn-off-scientific-notation-in-excel https://www.logicbroker.com/excel-scientific-notation-disable-prevent/

我希望其中一些对你有用。

我认为您可以将文件重命名为 .txt 而不是 .csv,excel 可能会有所不同。

祝你好运

【讨论】:

您链接中的那些方法是我尝试过的方法,但它并没有解决如果我去编辑 csv 文件,它会重置并将这些代码转换为科学计数法的大问题。现在我必须不断更新excel文件并制作一个新的csv。还有这个“我认为您可以将文件重命名为 .txt 而不是 .csv 并且 excel 可能会以不同的方式对待它。” 当您在 Excel 中打开一个 txt 文件时,它会为您提供更改单元格格式的选项,并且您可以选择文本。【参考方案2】:

如评论:

您可能会从文件中加载 csv:

$csv = Import-Csv -Path 'X:\original.csv' -UseCulture

下面的代码在 Here-String 中使用了一个虚拟 csv:

$csv = @'
"Column1","Column2","ValueThatMatters"
"Something","SomethingElse","1E53"
"AnotherItem","Whatever","4E12"
'@ | ConvertFrom-Csv

# in order to make Excel see the values as Text and not convert them into scientific numbers
$csv | ForEach-Object 
    # add a TAB character in front of the values in the column
    $_.ValueThatMatters = "`t0" -f $_.ValueThatMatters

$csv | Export-Csv -Path 'X:\ExcelFriendly.csv' -UseCulture -NoTypeInformation

【讨论】:

不幸的是,这对我不起作用。在 foreach 期间,它说在此对象上找不到我的列。 @MilanPatel 当然......我只是做了一个例子,因为你没有显示任何你的 csv 文件......将字段的名称从 ValueThatMatters 更改为 文件中的真实姓名 这就是我所做的 =),它仍然无法正常工作。此外,我将通过数据进行比较,所以可以说我确实将选项卡添加到 1E53。稍后如果我尝试比较来搜索它,1E53 不会等于 tab1E53。这是个问题。 @MilanPatel Well.. 对我来说它有效:(Import-Csv D:\Test\blah.csv)[0].ValueThatMatters -eq "`t1E53" 愉快地返回 True。您还可以使用Trim() 删除添加的空格(制表符),以便与原始值进行比较:(Import-Csv D:\Test\blah.csv)[0].ValueThatMatters.Trim() -eq "1E53"。仅当您想通过双击打开具有 Excel 中类似值的 CSV 文件时才需要 TAB 文件。 Excell 非常渴望“解释/转换”任何它认为可以转换的东西,无论你喜欢与否.. @MilanPatel 唯一的另一种方法是从新的 Excel 文件中打开 csv 并使用其菜单 Data --> From Text。然后,如果您通过向导,您可以告诉它不要转换值,而是将您的列视为文本。

以上是关于PowerShell 和 CSV:阻止 CSV 将文本数据转换为科学记数法的主要内容,如果未能解决你的问题,请参考以下文章

powershell 使用PowerShell将JSON转换为CSV格式

powershell 使用PowerShell将JSON转换为CSV格式

使用 powershell 将嵌套的复杂 XML 解析为 CSV

使用 PowerShell 将多个 CSV 文件合并为一个

PowerShell-将CSV导入SQL Server

使用 Powershell 将大型 CSV 批量导入 SQL Server