【问题标题】:Import-Excel converting column to scientific notation and corrupting valueImport-Excel 将列转换为科学计数法并破坏值
【发布时间】:2020-04-30 14:59:53
【问题描述】:

我正在尝试自动导入县文件并将其转换为 csv。我遇到的问题是帐号正在转换为科学计数法。

Import-Excel BacktaxRaw_FL_Flagler2.xlsx | Export-Csv ExportTest.csv

如果我尝试使用将数字字段格式化为文本字段

C:\testdata> Import-Excel BacktaxRaw_FL_Flagler.xlsx | Export-Excel ExportTest.xlsx -Show -AutoSize -NumberFormat '@'

这里的问题是帐号最后几位被零替换了。例子。原始数字是“1914310000010100016”,导入将其转换为“1.9143100000101E+18”,最后导出转换为“1914310000010100000”。如您所见,末尾的 16 被替换为 00。

具有讽刺意味的是,如果我将数据导入新的 excel 文件并指定通过 excel 导入数据并将类型定义为文本,那么我可以使用 Import-excel 毫无问题地转换为 csv。这告诉我 Import-Excel 正在努力从原始 excel 文件中导入数据。有人可以帮我解决这个问题吗?

我已附上导入文件: BacktaxRaw_FL_Flagler.xlsx

在做了一些研究并感谢 Ron 的建议后,我更深入地查看了上述文件的原始源代码。我解压缩了 BacktaxRaw_FL_Flagler.xlsx 文件的内容并导航到 \xl\worksheets\sheet1.xml 文件。我在记事本中打开并亲眼看到我在 A 列中查找的值都没有以科学计数法存储。它们实际上是完好无损地存储的。这意味着我为检索数据所做的每一次尝试都导致数据损坏。即使使用 Excel 自己的数据导入向导也会改变这些值。

Screen shot所以你不需要下载文件

如果需要,请在此处下载原始 xml 文件: Raw XML file

【问题讨论】:

  • 我很困惑。哪个是原始文件(excel 或 CSV),期望的结果是什么?如果 CSV 是原始的,您需要告诉 Excel 它正在导入的数据是 Text。如果 Excel 是原始文件,则链接文件中的数据已经存在您试图避免的错误。
  • Excel 文件是原始文件。我正在尝试任何转换为​​ csv 的方法。真正的问题是,在原始的 excel 文件中有一个名为“帐号”的列,其值为“1914310000010100016”。现在不管我用什么方法来转换(以编程方式)最终结果是一个 csv 文件要么有“1.9143100000101E+18”或“1914310000010100000”。请注意,最后两位数字被替换为 00。当我转换为 CSV 时,最终结果值“1914310000010100016”应该保持“1914310000010100016”。虽然我想使用 Import-Excel 我会使用任何东西。
  • 在您附加的文件中,我没有看到像 1914310000010100016 这样的 任何 值。 Account Number 列中的数值已经转换为它们的数值。请参阅第 3、23、25、28、30 行及更高的行。
  • 如果你不做任何事情直接在excel中打开你会看到1.91431E+18 (A3)。 Original File Screen Shot 如果您使用 Excels 数据导入向导并将 A 列设置为文本,您将看到正确的值。 Fixed File Screen Shot。但是当我使用 Import-Excel 导入时,我得到一个损坏的值Converted File Screen Shot
  • 是的,但是当你“使用 Excels 数据导入向导”时,你是从哪里导入的???

标签: excel powershell csv import-from-excel


【解决方案1】:

在 Excel 中导入 csv 有时会让你发疯。

最好的办法是下载原始 CSV 文件并在其中进行调整,然后在 Excel 中打开。

诀窍是让 Excel 将“帐号”列的值解释为 字符串,而不是数值。 这可以通过在该列中的所有值前面加上制表符 ("`t") 来完成。

$csvFileIn  = 'D:\Test\Report.csv'
$csvFileOut = 'D:\Test\CorrectedReport.csv'
$ColumnName = 'Account Number'

# import the csv file you have downloaded and format the "Account Number"
# column by prefixing the values with a TAB character ("`t").
# this will effectively force Excel NOT to interpret the value as numeric.
$csv = Import-Csv -Path $csvFileIn
foreach ($item in $csv) { $item.$ColumnName = "`t" + $item.$ColumnName }

# save the updated csv file
# the '-UseCulture' switch makes sure the delimiter used is the same that Excel will use on the same system
$csv | Export-Csv -Path $csvFileOut -UseCulture -NoTypeInformation

现在您只需双击“D:\Test\CorrectedReport.csv”文件即可在 Excel 中打开,它应该是这样的:

【讨论】:

  • 他知道这一切。显然,问题在于该县正在向他提供我认为是创建不正确的 Excel 文件。而且我无法弄清楚如何使用本机 Excel 工具创建这些错误,所以我认为他们使用非 Excel 工具创建了文件。希望他们使用的数据库能够导出为 CSV;或者他们可以修复 Excel 导出过程。
  • @RonRosenfeld The OP cmets “我下载了csv版本”,所以可以得到一个csv文件而不是excel。此外.. 是什么让你认为他知道所有这些?请让 D1gitalDR 决定。
  • 感谢 Theo 的回复。 csv 是一个选项,但不幸的是,最近,生成的县 csv 文件也已损坏,因为它们没有引用文本列,并且列值现在带有逗号。例如,收据列有一个收据编号列表,其中一列用逗号分隔。这导致 csv 导入中的列移位。 Excel 文件结构良好,这里唯一的问题是 Ron 指出的糟糕的 excel 结构。我希望有一种方法可以解析excel文件,因为数据在那里,只需要忽略文件中的数据类型指令。
【解决方案2】:

这种行为看起来很奇怪。特别是因为存储为文本字符串的 Excel 单元格在 Excel 中打开时将保留该属性。

所以我更深入地研究了 Open Office XML 规范。

仔细检查文档的 XML,似乎文档创建不正确。我怀疑 xlsx 工作簿不是由 Excel 创建的,而是由其他程序创建的。

如果我是正确的,对于有问题的单元格 A3,该值将存储为数字并格式化为 General。

<c r="A3" s="2"><v>1914310000010100016</v></c>

s="2"指向样式表中的一个General格式,值直接存储。

如果它以文本格式存储为字符串,则条目将类似于:

r="A3" s="1" t="s"&gt;&lt;v&gt;10247&lt;/v&gt;&lt;/c&gt;

其中t="s" 表示字符串表中的一个值——实际上是 SharedStrings 表中的第 10247 个(基于 0 的计数)条目,它甚至不存在于您的原始 xlsx 中,但如果您将 A3 格式化为文本,然后输入该条目的帐号,然后保存文件。

因此,我认为实际的 xlsx 文件创建存在问题,而不是导入过程的问题。而且我们无法控制。

如果无法更正文件创建问题,您将需要可以编辑 XML 文件的非 Excel 工具来更正问题。

注意:如果县可以提供 CSV 文件,而不是不正确创建的 Excel 文件,您应该可以轻松导入该文件。 注意:我看到页面上的选项之一是下载 CSV 文件。只需使用该选项,您就可以毫无问题地导入!

【讨论】:

  • 是的,县提供 csv 作为选项,但我们停止处理 csv 文件的原因之一是因为最近 csv 文件的格式也没有正确。文本列没有被正确引用,因此文件中的逗号会混淆导入。对于该县,文件格式正确,但并非所有县都如此。在这种情况下,excel 文件更好,但我面临 excel 损坏的值问题。岩石和坚硬的地方情况。我很想回到 csv,但没有修复格式错误的 csv。我希望 excel 有一个解决方法。
  • 我认为您需要与您所在县的 IT 部门交谈。
  • 我还应该指出,Import-Excel powershell 模块不需要 excel 安装,也不需要使用 excel 对象。这就是为什么我希望这个库有一种方法来解析 excel 文件并忽略格式说明。只需获取 xml 中存在的值即可。
  • 也许发布一个关于如何编辑 Excel 文件底层 XML 的更集中的问题,将获得有用的响应。包括有关 CSV 文件问题的信息,以及我们在您的问题中的 XLM 中看到的内容。我来看看import-Excel 模块。
  • @D1gitalDR 为什么不使用 Power Query 在 Excel 中执行此操作?您已经证明 PQ 可以导入文件,如果您将 Account Number 列指定为文本,它将返回正确的帐号。然后您所要做的就是将该工作表保存为 CSV 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2021-12-17
  • 2019-07-09
  • 1970-01-01
相关资源
最近更新 更多