【问题标题】:Powershell < symbol in property namePowershell < 属性名称中的符号
【发布时间】:2011-10-18 22:33:05
【问题描述】:

我正在 powershell 中处理一个 csv 文件,如下所示:

<TICKER>,<DTYYYYMMDD>,<TIME>,<OPEN>,<HIGH>,<LOW>,<CLOSE>,<VOL>
AUDJPY,20010102,230100,64.30,64.30,64.30,64.30,4
AUDJPY,20010102,230300,64.29,64.29,64.29,64.29,4
<snip>

我正在使用Import-Csv 处理文件,我想找到大于20110101 的返回&lt;DTYYYYYMMDD&gt; 值。我试过这个:

foreach($file in ls $PriceFolder\*.txt) {Import-Csv $file | Where-Object {$_.&lt;DTYYYYMMDD&gt; -ge 20110101}}

但我收到此错误

Missing property name after reference operator. 我猜是因为

【问题讨论】:

    标签: powershell import


    【解决方案1】:

    1) 使用 {} 包含非标准字段名称(或将它们存储在变量中并引用为 $_.$var); 2) 将值转换为 [int] 以避免出现问题(数据从 .csv 中读取为字符串;在此示例中,这可能不是问题,但是..)

    这行得通:

    Import-Csv test.csv | Where-Object {[int]$_.{<DTYYYYMMDD>} -ge 20010102}
    

    【讨论】:

    • 谢谢,我正在处理的文件有超过 400 万行。处理它的最快方法是什么?我要做的就是将行复制到&lt;DTYYYYMMDD&gt; 列大于20110101 的新文件中。使用这种方法很慢。我应该使用Out-File 吗? Import-Csv 是最好的方法吗?
    • 如果您的数据不是微不足道的,那么请考虑使用 Microsoft.VisualBasic.FileIO.TextFieldParser
    • 太好了,它比我使用相同类编写的 C# 方法更快但仍然慢得多。为什么?我使用System.IO.StringReader 读取文件,System.IO.StringWriter 写出我想要的每一行。
    • 这个其实我再写一个问题。
    【解决方案2】:

    您可以引用属性名称:

    $_.'<DTYYYYMMDD>'
    

    【讨论】:

      【解决方案3】:

      就像对 MrKWatkins 回答的评论一样,在一种情况下单引号有效,但双引号无效(至少在 2.0 版中):

      单引号:

      (dir | Select-Object {$_.Name})[0].'$_.Name'       # GOOD: correctly gives name
      

      双引号:

      (dir | Select-Object {$_.Name})[0]."$_.Name"       # BAD: returns nothing
      

      编辑: 双引号允许变量扩展,而单引号则不允许。更多详情请见this answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 2019-10-08
        • 2023-03-26
        • 1970-01-01
        • 2023-02-21
        相关资源
        最近更新 更多