-分割函数不';I don’我不能在大文件Powershell中工作

-分割函数不';I don’我不能在大文件Powershell中工作,powershell,csv,split,Powershell,Csv,Split,我正在尝试使用Powershell解析csv文件,但拆分函数不起作用。我正在使用拆分和原始行比较文件输出。“拆分”仅适用于前几行。我不知道我是否错过了什么。这是我的密码 $table = Get-Content .\random.csv -ReadCount 1000 $fname_mid = 'ps.mid' $fname_mif = 'ps.mif' New-Item -Path . -Name $fname_mid -ItemType 'file' -Force New-Item -P

我正在尝试使用Powershell解析csv文件,但拆分函数不起作用。我正在使用拆分和原始行比较文件输出。“拆分”仅适用于前几行。我不知道我是否错过了什么。这是我的密码

$table = Get-Content .\random.csv -ReadCount 1000

$fname_mid = 'ps.mid'
$fname_mif = 'ps.mif'

New-Item -Path . -Name $fname_mid -ItemType 'file' -Force
New-Item -Path . -Name $fname_mif -ItemType 'file' -Force

ForEach($_ In $table) 
{
    $read_field = $_ -split ','
    $read_line = '----' + $read_field[0] + ',-' + $read_field[9] + '-'

    $read_line | Out-File -Encoding 'UTF8' -FilePath $fname_mid -Append
    $_ | Out-File -Encoding 'UTF8' -FilePath $fname_mif -Append
}

用于测试的文件

考虑到您问题中的问题(也在注释中列出):

  • 发件人:
    此>>
    ForEach($表中的$)
    对象[]

    ($Table[0]-split[System.Environment]::NewLine)。计数
    =>1000和
    ($Table[-1]-split[System.Environment]::NewLine)。计数
    =>233
  • 在提供的示例中有9列,这意味着最后一项是
    $read\u字段[8]
    8
    9
  • 这个语句,
    $\u124; Out File-Encoding'UTF8'-FilePath$fname\u mif-Append
    没有多大作用(除非您的源代码不是
    UTF8
    ,但还有其他方法可以实现相同的功能)
  • 您希望如何处理输入文件中的引号
您将得到如下结果:

$table = Get-Content .\random.csv

$fname_mid = 'ps.mid'
$fname_mif = 'ps.mif'

New-Item -Path . -Name $fname_mid -ItemType 'file' -Force
New-Item -Path . -Name $fname_mif -ItemType 'file' -Force

ForEach($Line In $table) 
{
    $read_field = $Line -split ','
    $read_line = '----' + $read_field[0] + ',-' + $read_field[8] + '-'

    $read_line | Out-File -Encoding 'UTF8' -FilePath $fname_mid -Append
    # $Line | Out-File -Encoding 'UTF8' -FilePath $fname_mif -Append
}
但您低估了(如所评论的)的性能(和易用性)以及它附带的复杂PowerShell管道。关键是,如果要将性能度量值与为流式生成的cmdlet进行比较,则不能仅基于单个命令。在这种情况下,您需要测量完整的解决方案

如果您的(更正的)示例花费的时间超过7分钟,
流式处理将花费少于3秒的时间:

Import-Csv .\random.csv -Head (0..8) | 
ForEach-Object {"----$($_.0),-$($_.8)-"} | 
Set-Content .\fname_mid

考虑到您的问题(也在评论中列出)中的问题:

  • 发件人:
    此>>
    ForEach($表中的$)
    对象[]

    ($Table[0]-split[System.Environment]::NewLine)。计数
    =>1000和
    ($Table[-1]-split[System.Environment]::NewLine)。计数
    =>233
  • 在提供的示例中有9列,这意味着最后一项是
    $read\u字段[8]
    8
    9
  • 这个语句,
    $\u124; Out File-Encoding'UTF8'-FilePath$fname\u mif-Append
    没有多大作用(除非您的源代码不是
    UTF8
    ,但还有其他方法可以实现相同的功能)
  • 您希望如何处理输入文件中的引号
您将得到如下结果:

$table = Get-Content .\random.csv

$fname_mid = 'ps.mid'
$fname_mif = 'ps.mif'

New-Item -Path . -Name $fname_mid -ItemType 'file' -Force
New-Item -Path . -Name $fname_mif -ItemType 'file' -Force

ForEach($Line In $table) 
{
    $read_field = $Line -split ','
    $read_line = '----' + $read_field[0] + ',-' + $read_field[8] + '-'

    $read_line | Out-File -Encoding 'UTF8' -FilePath $fname_mid -Append
    # $Line | Out-File -Encoding 'UTF8' -FilePath $fname_mif -Append
}
但您低估了(如所评论的)的性能(和易用性)以及它附带的复杂PowerShell管道。关键是,如果要将性能度量值与为流式生成的cmdlet进行比较,则不能仅基于单个命令。在这种情况下,您需要测量完整的解决方案

如果您的(更正的)示例花费的时间超过7分钟,
流式处理将花费少于3秒的时间:

Import-Csv .\random.csv -Head (0..8) | 
ForEach-Object {"----$($_.0),-$($_.8)-"} | 
Set-Content .\fname_mid

此>>
ForEach($表中的$)
-ReadCount
指定一次通过管道发送多少行内容。因此,
$Table.Count
=>40和
$Table[0].Gettype()
=>Object[]
($Table[0]-split[System.Environment]::NewLine)。Count
=>1000和
($Table[-1]-split[System.Environment]::NewLine)。Count
=>233.为什么不使用导入csv?如果它是一个普通的csv,这将是一个简单的方法。@WalterMitty,因为当文件大小大于10MBIt时,它的速度非常慢,当您通过管道输入它的输出时,它的速度会快一点。这个>>
ForEach($In$table)
-ReadCount
指定一次通过管道发送多少行内容。因此,
$Table.Count
=>40和
$Table[0].Gettype()
=>Object[]
($Table[0]-split[System.Environment]::NewLine)。Count
=>1000和
($Table[-1]-split[System.Environment]::NewLine)。Count
=>233.为什么不使用导入csv?如果它是一个普通的csv,这将是一个简单的方法。@WalterMitty,因为当文件大小大于10MBIt时,它的速度会非常慢。当您通过管道提供其输出时,它的速度会稍微快一点。感谢您在回答中引用我的评论。我原以为这是一种方法,但我太懒了,无法构建使用导入csv的答案。我是Powershell的新手,它帮助我了解PS的工作原理,谢谢。感谢您在回答中引用我的评论。我认为这是一种方法,但我太懒了,无法构建使用导入csv的答案。我是Powershell的新手,它帮助我了解PS的工作原理,谢谢。