【问题标题】:Splitting Export large CSV files via Powershell通过 Powershell 拆分导出大型 CSV 文件
【发布时间】:2017-01-05 20:39:40
【问题描述】:

就像每个人都知道 excel 的最大行数为 1048574。我的问题是:当达到最大行数时,然后移动到一个新的 CSV 文件我尝试了一些没有运气的东西,我无法弄清楚。

$RootFolder = Get-Content "c:\DRIVERS\myfile.txt"

foreach ($arrayOfPaths in $RootFolder){

  $csv  = $arrayofPaths -replace '^\\\\[^\\]+\\([^\\]+)\\([^\\]+).*', 'C:\output\Company_name_${1}_${2}.csv'
  Get-ChildItem $arrayOfPaths -Recurse | Where-Object {$_.mode -match "d"} | ForEach-Object {
$path = $_.FullName
  Get-Acl $path | Select-Object -Expand Access |
    Select-Object @{n='Path';e={$path}}, IdentityReference, AccessControlType,
                  FileSystemRights |
    Export-Csv $csv -Append -NoType
  }

}

最后更新:

$RootFolder = Get-Content "c:\DRIVERS\myfile.txt"

foreach ($arrayOfPaths in $RootFolder){

  $csv  = $arrayofPaths -replace '^\\\\[^\\]+\\([^\\]+)\\([^\\]+).*', 'C:\output\Company_name_${1}_${2}.csv'
  $csvIndex = 1
  $maxRows = 1000000
  $rowsLeft = $maxRows

  Get-ChildItem $arrayOfPaths -Recurse | Where-Object {$_.mode -match "d"} | ForEach-Object {
  #$csv  = $_.FullName -replace '^\\\\[^\\]+\\([^\\]+)\\([^\\]+).*', 'C:\output\Company_name_${1}_${2}.csv'# <- construct CSV path here
  $path = $_.FullName
  $thisCSV = Get-Acl $path | Select-Object -Expand Access |
    Select-Object @{n='Path';e={$path}}, IdentityReference, AccessControlType,
                  FileSystemRights |
    ConvertTo-Csv
if ($thisCSV.count -lt $rowsLeft) {
    $thisCSV | Export-Csv $csv -append -noType
    $rowsLeft -= $thisCSV.count
} else {
    $thisCSV[0..($rowsLeft - 1)] | Export-Csv $csv -append -noType
    $csvIndex++
    $csv = $csv -replace '\.csv$', "$csvIndex.csv"
    if ($thisCSV.count -gt $rowsLeft) {
        $thisCSV[$rowsLeft..($thisCSV.count - 1)] | Export-Csv $csv -append -noType
    }
    $rowsLeft = $maxRows - ($thisCSV.count - $rowsLeft)
}


  }

}

【问题讨论】:

  • @pnuts 我已经编辑了我的问题
  • 由于业务需求,我必须通过 Excel 应用程序打开 CSVs 文件因此我想通过 powershell 拆分 CSV 文件

标签: excel windows powershell csv filesystems


【解决方案1】:

在临时变量中执行ConvertTo-Csv,将其.Count 属性相加,直到达到拆分点,然后将 CSV 数组拆分为一个新文件,该文件具有从此时起使用的新名称。

下面是一个简化示例,假设单个 CSV 不能超过 1000000 行。

$csv = .............
$csvIndex = 1
$maxRows = 1000000
$rowsLeft = $maxRows

...........
$thisCSV = Select-Object ........ |
           ConvertTo-Csv
if ($thisCSV.count -lt $rowsLeft) {
    $thisCSV | Export-Csv $csv -append -noType
    $rowsLeft -= $thisCSV.count
} else {
    $thisCSV[0..($rowsLeft - 1)] | Export-Csv $csv -append -noType
    $csvIndex++
    $csv = $csv -replace '\.csv$', "$csvIndex.csv"
    if ($thisCSV.count -gt $rowsLeft) {
        $thisCSV[$rowsLeft..($thisCSV.count - 1)] | Export-Csv $csv -append -noType
    }
    $rowsLeft = $maxRows - ($thisCSV.count - $rowsLeft)
}

【讨论】:

  • 首先非常感谢您,我不明白如何才能完全适应您的代码。例如 $thisCSV = Select-Object ........ 我在这里需要做什么?那么我必须在代码末尾的 Export-Csv $csv -Append -NoType 命令之后使用它吗?
  • AFAIK $thisCSV = Get-Acl $path |选择对象-展开访问 |选择对象@{n='Path';e={$path}}、IdentityReference、AccessControlType、FileSystemRights | ConvertTo-Csv 我正确吗?
  • 是的,你是对的。我忽略了那行的开头,很抱歉造成混乱。
  • 好的,但是我有一个问题,我看不到任何与 NTFS 权限相关的值,而不是这个我可以看到“长度”列标题我假设存在与语法相关的逻辑错误跨度>
  • 好吧,我自然没有调试代码,只是说明概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2015-11-25
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多