Out-File 制表符分隔的文件问题
Out-File tab-delimited file issue
每天我都会收到许多需要导入系统的 CSV 文件。但在导入它们之前,我需要将它们全部编码为 UTF-8,然后将它们一一上传。这就是为什么我想要一个脚本,它将所有 *.csv 文件编码为 UTF-8,然后将它们合并到一个文件中。
脚本运行良好,但是当我导出文件时,第一个选项卡被删除,这是一个大问题。
一个文件在编码和合并之前的样子:
USERID ACTIVE FIRSTNAME LASTNAME EMAIL LANGUAGE HOSTPRIVILEGE TIMEZONE DIVISION DEPARTMENT PROJECT OTHER CUSTOM5 CUSTOM6 CUSTOM7 CUSTOM8 CUSTOM9 CUSTOM10 COUNTRY
Y <firstname> <lastname> <name@mail.com> de <text> <text> <randomnumber>
(看起来,Whosebug 不喜欢 TAB?或者我只是为了菜鸟..:S)
实际上第二行以一个制表符开始,然后每个 "block" 由一个制表符分隔。除了最后一个,"text"和"randomnumber"之间还有7个tab。
当我 运行 脚本时,它看起来像这样:
USERID ACTIVE FIRSTNAME LASTNAME EMAIL LANGUAGE HOSTPRIVILEGE TIMEZONE DIVISION DEPARTMENT PROJECT OTHER CUSTOM5 CUSTOM6 CUSTOM7 CUSTOM8 CUSTOM9 CUSTOM10 COUNTRY
Y <firstname> <lastname> name@mail.com de <text> <text> <randomnumber>
Y <firstname> <lastname> name@mail.com de <text> <text> <randomnumber>
第一个标签丢失了。
这里是 PowerShell 脚本:
Copy-Item "._Input\*.csv" "._cache"
Get-ChildItem "._Cache\*.csv" | foreach {
(Get-Content $_.FullName) | Set-Content $_.FullName -Encoding UTF8
}
ls "._cache" -Fi *.csv | ipcsv |
ConvertTo-Csv -NoTypeInformation |
% { $_ -replace '"', ''} |
Out-File "._output\concat.csv" -fo -en utf8
Remove-Item "._cache\*.csv"
编辑:我找到了一个 "workaround",我添加了参数
ipcsv -delimiter "`t"
但是当我将参数添加到 ConvertTo-CSV 时出现错误。所以现在它用分隔符“,”导出。但谢天谢地,系统能够读取 import 它也是逗号分隔的。
如果您只想将文件转换为 UTF-8,然后将它们连接起来,那么从一个文件中获取 header 行,然后跳过所有文件的 header 会简单得多将文件写入输出文件时:
$files = @(Get-ChildItem '._Input\*.csv')
$outfile = 'concat.csv'
Get-Content $files[0] -TotalCount 1 | Set-Content $outfile -Encoding UTF8
$files | ForEach-Object {
Get-Content $_.FullName | Select-Object -Skip 1
} | Add-Content $outfile -Encoding UTF8
每天我都会收到许多需要导入系统的 CSV 文件。但在导入它们之前,我需要将它们全部编码为 UTF-8,然后将它们一一上传。这就是为什么我想要一个脚本,它将所有 *.csv 文件编码为 UTF-8,然后将它们合并到一个文件中。
脚本运行良好,但是当我导出文件时,第一个选项卡被删除,这是一个大问题。
一个文件在编码和合并之前的样子:
USERID ACTIVE FIRSTNAME LASTNAME EMAIL LANGUAGE HOSTPRIVILEGE TIMEZONE DIVISION DEPARTMENT PROJECT OTHER CUSTOM5 CUSTOM6 CUSTOM7 CUSTOM8 CUSTOM9 CUSTOM10 COUNTRY
Y <firstname> <lastname> <name@mail.com> de <text> <text> <randomnumber>
(看起来,Whosebug 不喜欢 TAB?或者我只是为了菜鸟..:S)
实际上第二行以一个制表符开始,然后每个 "block" 由一个制表符分隔。除了最后一个,"text"和"randomnumber"之间还有7个tab。
当我 运行 脚本时,它看起来像这样:
USERID ACTIVE FIRSTNAME LASTNAME EMAIL LANGUAGE HOSTPRIVILEGE TIMEZONE DIVISION DEPARTMENT PROJECT OTHER CUSTOM5 CUSTOM6 CUSTOM7 CUSTOM8 CUSTOM9 CUSTOM10 COUNTRY
Y <firstname> <lastname> name@mail.com de <text> <text> <randomnumber>
Y <firstname> <lastname> name@mail.com de <text> <text> <randomnumber>
第一个标签丢失了。
这里是 PowerShell 脚本:
Copy-Item "._Input\*.csv" "._cache"
Get-ChildItem "._Cache\*.csv" | foreach {
(Get-Content $_.FullName) | Set-Content $_.FullName -Encoding UTF8
}
ls "._cache" -Fi *.csv | ipcsv |
ConvertTo-Csv -NoTypeInformation |
% { $_ -replace '"', ''} |
Out-File "._output\concat.csv" -fo -en utf8
Remove-Item "._cache\*.csv"
编辑:我找到了一个 "workaround",我添加了参数
ipcsv -delimiter "`t"
但是当我将参数添加到 ConvertTo-CSV 时出现错误。所以现在它用分隔符“,”导出。但谢天谢地,系统能够读取 import 它也是逗号分隔的。
如果您只想将文件转换为 UTF-8,然后将它们连接起来,那么从一个文件中获取 header 行,然后跳过所有文件的 header 会简单得多将文件写入输出文件时:
$files = @(Get-ChildItem '._Input\*.csv')
$outfile = 'concat.csv'
Get-Content $files[0] -TotalCount 1 | Set-Content $outfile -Encoding UTF8
$files | ForEach-Object {
Get-Content $_.FullName | Select-Object -Skip 1
} | Add-Content $outfile -Encoding UTF8