使用PowerShell限制csv列长度

时间:2016-08-08 10:08:26

标签: powershell truncate

我正在尝试使用PowerShell调整制表符分隔的文本文件而不使用标题,并将输出写入相同的制表符分隔文本文件。目前的源数据如下;

  • AAA \ t BBBBBB \ t CCCCCCCCCCC
  • AAAA \ t BBBB \ t AAAABBBBBCCCCCCC

现在,第3列应仅限于前5个字符,使输出看起来如下;

  • AAA \ t BBBBBB \ t CCCCC
  • AAAA \ t BBBB \ t AAAAB

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:2)

以下代码将使用import types function = types.FunctionType builtin_function_or_method = types.BuiltinFunctionType classobj = types.ClassType generator = types.GeneratorType object = type del types 导入CSV文件,然后循环遍历所有行,在将行写入新CSV文件之前创建第3列的子字符串(长度为5)。

Import-Csv

答案 1 :(得分:1)

导入后截断:

Import-Csv ... | ForEach-Object { if ($_.Column3.Length -gt 5) { $_.Column3.Substring(0, 5) }; $_ }

如果您希望在所有属性中应用规则,则可以创建一个通用属性循环,而不是按名称定位特定属性。

Import-Csv ... | ForEach-Object {
    foreach ($property in $_.PSObject.Properties) {
        if ($property.Value.Length -gt 5) {
            $property.Value = $property.Value.Substring(0, 5)
        }
    }
    $_
}

Import-Csv本身不会为你做到这一点,它不是它所训练的工作。

答案 2 :(得分:0)

您可以将自己的标题信息传递给Import-Csv

# Import the file with the proper delimiter and dummy headings
(Import-Csv foo.tsv -delim "`t" -header c1,c2,c3) |
  # Truncate the third column accordingly. Regex because I'm lazy.
  ForEach-Object { $_.c3 = $_.c3 -replace '(?<=^.{5}).*'; $_ } |
  # Convert back to TSV. This also emits the headers
  ConvertTo-Csv -NoTypeInformation -delim "`t" |
  # Remove the headers again
  Select -Skip 1 |
  # Write back to file
  Out-File foo.tsv -Encoding UTF8

答案 3 :(得分:0)

更好的模块化方法是将修改后的对象传递给Export-Csv Commandlet。

$charLimit=100
Import-Csv "$_" -Delimiter "`t" | ForEach-Object {
   $_."column 1" = $_."column 1".Substring(0,[Math]::Min($charLimit,($_.'column 1').Length))
   $_."column 2" = $_."column 2".Substring(0,[Math]::Min($charLimit,($_.'column 2').Length))
   Write-Output $_
} | Export-Csv $targetfile -NoTypeInformation

在上面的代码片段Write-Output中,将修改后的对象向下传递到管道。这将比修改时写入要快,因为Export-Csv会更好地处理文件输出。

相关问题