我正在尝试使用PowerShell调整制表符分隔的文本文件而不使用标题,并将输出写入相同的制表符分隔文本文件。目前的源数据如下;
现在,第3列应仅限于前5个字符,使输出看起来如下;
我怎样才能做到这一点?
答案 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会更好地处理文件输出。