【问题标题】:Using PowerShell to open large csv files and exporting specific columns使用 PowerShell 打开大型 csv 文件并导出特定列
【发布时间】:2021-01-22 08:04:38
【问题描述】:

我正在使用下面的命令来获取前 1000 行数据:

Get-Content -First 1000 'C:\Users\Inspiron\Desktop\base.csv' | Out-File 'C:\Users\Inspiron\Desktop\sample.csv'

但是,如何调整此命令以获取数据范围。例如,提取第 700 到 900 行之间的间隔。

另一件事,我怎样才能只导出几个变量。例如,我的数据库有 120 列,但我只想保存变量年份(第 1 列)、出生日期(第 4 列)和原产国(第 100 列)。

【问题讨论】:

    标签: powershell csv export-to-csv


    【解决方案1】:

    我建议使用import-csv 而不是get-content

    实现这一目标的一种方法是使用类似的东西:

    $csv = Import-CSv $csvPATH 
    $rangeselect = $csv[700..900]
    

    只需编写一个快速测试,您应该会得到类似的结果(我自己在更小的范围内选择):

    test test1 test2
    ---- ----- -----
    8    9     10   
    9    10    11   
    10   11    12   
    11   12    13   
    12   13    14   
    13   14    15   
    14   15    16   
    15   16    17   
    16   17    18
    

    关于选择特定的列,您也可以使用import-csv 来实现。以上述为例,您可以添加:

    $specificcol = $rangeselect.test1
    

    您可以看到.test1 专门针对一个列,并使用它来应用您试图抓取的内容。

    【讨论】:

      【解决方案2】:

      有几种方法可以解决这个问题。大楼Mathews helpful answer

      $InCsv  = 'C:\Users\Inspiron\Desktop\base.csv'
      $OutCsv = 'C:\Users\Inspiron\Desktop\sample.csv'
      $Props  = "year","date of birth","state of origin"
      
      $InCsv = Import-Csv $InCsv
      $rangeselect = $InCsv[700..900] # You could use variables here too...
      
      $rangeselect | 
      Select-Object $Props |
      Export-Csv -Path $OutCsv -NoTypeInformation
      

      这需要选择您想要的属性并将它们重新导出到新的 CSV 文件的附加步骤。

      注意:这不太可能,但如果您正在处理非常大的文件,这种方法可能会出现内存问题。它预先将整个文件读入内存,并将其存储在$csv 变量中。如果系统受内存限制,也可能发生这种情况,但这种情况很少见。

      从技术上讲,您不需要分配 $rangeselect 变量,您可以直接在 Import-Csv 命令上使用范围运算符“..”,例如:

      (Import-Csv $InCsv)[700..900] | 
      Select-Object $Props |
      Export-Csv -Path $OutCsv -NoTypeInformation
      

      这里,(..) 在引用之前首先完成了所有 CSV 数据的读取,所以它的工作原理应该差不多。


      如果您想在初始样本的基础上进行构建。其优点是只读取前 1000 行,很可能绕过任何内存限制:

      $InCsv  = 'C:\Users\Inspiron\Desktop\base.csv'
      $OutCsv = 'C:\Users\Inspiron\Desktop\sample.csv'
      $Props  = "year","date of birth","state of origin"
      $Skip   = 700
      $First  = 200
      
      Get-Content -First 1000 $InCsv | 
      ConvertFrom-Csv |
      Select-Object -Skip $Skip -First $First -Property $Props |
      Export-Csv -Path $OutCsv -NoTypeInformation
      

      这实际上是一个带有一些便利变量的单行代码。它利用了Select-Object 中的参数。请注意,它也只返回您要求的属性,因此将输出一个仅包含该数据的新 CSV 文件。


      您也可以组合这些方法,因为Select-Object 允许-Skip-First-Last 参数用于一些基本的初始过滤。这可能看起来像:

      $InCsv  = 'C:\Users\Inspiron\Desktop\base.csv'
      $OutCsv = 'C:\Users\Inspiron\Desktop\sample.csv'
      $Props  = "year","date of birth","state of origin"
      $Skip   = 699
      $First  = 200
      
      Import-CSv $InCsv |
      Select-Object -Skip 700 -First 200 -Property $Props |
      Export-Csv -Path $OutCsv -NoTypeInformation
      

      在此示例中,您可能必须使用边界。但是,它实际上仍然是单线的,并且有可能获得您正在寻找的东西。

      注意:Select-Object 可以告诉管道左侧的命令停止发送数据。但是,我不确定每个 cmdlet 都能正确反应,因此与 Get-Content 方法相比,性能可能会有所不同。这可能仅在您处理更大的文件时才重要,否则我会采用任何被认为更具可读性和/或可维护性的方法......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-22
        • 2021-02-13
        • 1970-01-01
        相关资源
        最近更新 更多