【问题标题】:Strange CSV header whitespace handling奇怪的 CSV 标头空白处理
【发布时间】:2021-10-18 09:32:18
【问题描述】:

我想知道 PowerShell 究竟如何处理 CSV 标头中的(未加引号的)空格...

考虑这个简单的例子:

ConvertFrom-Csv @"
Foo;
Bar
"@ -Delim ";" | select "Foo"

像魅力一样工作。现在,当我在标题中添加一个空格时,它将被保留:

ConvertFrom-Csv @"
Foo ;
Bar
"@ -Delim ";" | select "Foo "

很公平。但是当我添加更多空格时,属性名称的末尾仍然会有只有一个空格:

ConvertFrom-Csv @"
Foo   ;
Bar
"@ -Delim ";" | select "Foo "

我在想,也许 PowerShell 用一个空格替换多个连续的空格,以清理由多个单词组成的标题,但没有:

ConvertFrom-Csv @"
Foo   Bar;
Hello
"@ -Delim ";" | select "Foo   Bar"

更奇怪的是:现在,任何末尾的空格似乎都被保留了,奇怪的“单个空格”行为消失了:

ConvertFrom-Csv @"
Foo   Bar   ;
Hello
"@ -Delim ";" | select "Foo   Bar   "

另外,请注意任何 前导 空格显然总是被修剪。但到目前为止,我还没有做更多的测试。

谁能解释这种行为?

我找不到任何文档。如果所有的空白要么总是被保留,要么总是被修剪,这将是有意义的。但是这种行为非常难以处理。 Import-Csv 似乎也有同样的行为。

(版本:PowerShell 5.1)

编辑

请注意,我不拥有 CSV。它是由客户提供的。我知道可以引用标题,但这是关于现有 CSV 的处理,而不是如何修改它。我知道如何解决这个问题,但这不是问题的目的。

理想情况下,我希望 PowerShell不会保留任何尾随空格,所以我想知道为什么它会保留,因为这使得使用起来更加困难。

【问题讨论】:

  • 这是一个真正的ConvertFrom-Csv/Import-Csv cmdlet 特定问题。老实说,我对此过于关注,因为如果csv 标头有任何(前导或尾随)空格(也用于可读性),我会简单地引用它们,例如' " Foo Bar " '; ...。在这种情况下,没有讨论空格是标题的一部分还是分隔符的一部分。
  • 当然是关于这两个 cmdlet,正如我在问题中所述。这几乎就是 PowerShell 的内置 CSV 处理的全部内容。另外,请注意我的编辑。我知道可以引用标题,但这不是重点。
  • 您可以考虑将您的反馈发送至documentation 或(基于@Danny_ds 的回答)purpose a (break?) change on the cmdlets

标签: powershell csv powershell-5.1


【解决方案1】:

保留(未加引号的)字段 should 周围的空格,但实际上解析器可能会有所不同。

空格被视为字段的一部分,不应被忽略。

保存它们的最佳方法可能是用双引号将字段括起来:

" Foo   Bar   ";

只要确保分隔符和双引号之间没有空格,否则事情可能会变得陌生:)

【讨论】:

  • 请注意我的问题中的编辑。问题是不是“如何保留空白”,因为我当然知道我可以使用引号。再说一次,正如您自己所说的那样.. 如果引号和分隔符之间有 空格怎么办...?
  • 不过,阅读本案例的规范很有趣。
  • 至于“引号和分隔符之间的空格”,我认为这可以看作是“未定义的行为”。不同的解析器会产生不同的结果,有些会报错。
猜你喜欢
  • 2022-01-18
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
相关资源
最近更新 更多