我正在尝试使用powershell脚本将两个TXT文件转换为一个CSV文件。当文件具有相同的结构和相同的行数时,大小写看起来很容易。但在我的情况下,txt文件具有不同的结构。
两个txt文件中的管道符号都不是分隔符,应该被视为正常字符,它是一个字符串。
文件URL.txt
L5020|http://linktosite.de|URL
L100|http://sitelink.de|URL
L50|http://abcde.de|URL
L511|http://bbcccddeee.de|URL
L300|http://link123456.de|URL
L5450|http://randomlink.de|URL_DE
L5460|http://randomwebsitelink.de|URL_DE
文件URL1.txt
L5020|http://linktosite.de|URL|P555
L100|http://sitelink.de|URL|P523
L50|http://abcde.de|URL|P53
L511|http://bbcccddeee.de|URL|P540
CSV,我希望它应该像下面这样,分隔符是";">
HEADER1;HEADER2
L5020|http://linktosite.de|URL;L5020|http://linktosite.de|URL|P555
L100|http://sitelink.de|URL;L100|http://sitelink.de|URL|P523
L50|http://abcde.de|URL;L50|http://abcde.de|URL|P53
L511|http://bbcccddeee.de|URL;L511|http://bbcccddeee.de|URL|P540
L300|http://link123456.de|URL;
L5450|http://randomlink.de|URL_DE;
L5460|http://randomwebsitelink.de|URL_DE;
我试过类似的东西
$URL = "C:UsersXXXDesktopURL.txt"
$URLcontent = Get-Content $URL
$URL1 = "C:UsersXXXDesktopURL1.txt"
$URLcontent1 = Get-Content $URL1
$results = @() # Empty array to store new created rows in
$csv = Import-CSV "C:UsersXXXDesktopmap.csv" -Delimiter ';'
foreach ($row in $csv) {
$properties = [ordered]@{
HEADER1 = $URLcontent
HEADER2 = $URLcontent1
}
# insert the new row as an object into the results-array
$results += New-Object psobject -Property $properties
}
# foreach-loop filled the results-array - export it as a CSV-file
$results | Export-Csv "C:UsersXXXXDesktopmap_final.csv" -NoTypeInformation
类似的东西:
import-csv URL.txt -Header 'HEADER1' | Export-CSV "C:UsersxxxDesktopURL.csv" -Delimiter ';' -NoTypeInformation
import-csv URL1.txt -Header 'HEADER2' | Export-CSV "C:UsersxxxDesktopURL1.csv" -Delimiter ';' -NoTypeInformation
Get-ChildItem "C:UsersxxDesktop" -Filter "URL*.csv" | Select-Object -ExpandProperty FullName | Import-Csv | Export-Csv .combinedcsvs.csv -NoTypeInformation -Append
没有任何成功。。。
BR
根据问题中的更新,如果你想自己构建一些东西,你可能想做这样的事情:
$Url1 = @(Get-Content .URL1.txt)
$i = 0
Get-Content .URL.txt | Foreach-Object {
[pscustomobject]@{
HEADER1 = $_
HEADER2 = If ($i -lt $URL1.Count) { $URL1[$i++] }
}
} | Export-Csv .combinedcsvs.csv -Delimiter ';' -NoTypeInformation -Append
如果你不想经历重新发明轮子的麻烦(所有陷阱都包括性能调整(。使用我在评论中提到的Join对象:
Import-Csv .URL.txt -Header HEADER1 |
LeftJoin (Import-Csv .URL1.txt -Header HEADER2) |
Export-Csv .combinedcsvs.csv -Delimiter ';' -NoTypeInformation -Append
- 注意1:我不知道你为什么要导入
map.csv
之类的东西,我认为这是必需的 - 注意2:如果你仍然想走自己的路,尽量避免使用递增赋值运算符(+=(来创建集合,这是一个非常昂贵的运算符
- 注意3:通常不建议在行索引上联接行,因为列表可能未排序或有重复项,因此最好联接特定属性上的列表,如
Url
:
Import-Csv .URL.txt -Delimiter '|' -Header Lid,Url,Type |
LeftJoin (Import-Csv .URL1.txt -Delimiter '|' -Header Lid2,Url,Type2,Pid) -On Url |
Format-Table # or: Export-Csv .combinedcsvs.csv -Delimiter ';' -NoTypeInformation
Lid Url Type Lid2 Type2 Pid
--- --- ---- ---- ----- ---
L5020 http://linktosite.de URL L5020 URL P555
L100 http://sitelink.de URL L100 URL P523
L50 http://abcde.de URL L50 URL P53
L511 http://bbcccddeee.de URL L511 URL P540
L300 http://link123456.de URL
L5450 http://randomlink.de URL_DE
L5460 http://randomwebsitelink.de URL_DE
或者在所有三个(Lid
、Url
和Type
(属性上:
Import-Csv .URL.txt -Delimiter '|' -Header Lid,Url,Type |
LeftJoin (Import-Csv .URL1.txt -Delimiter '|' -Header Lid,Url,Type,Pid) -On Lid,Url,Type |
Format-Table # or: Export-Csv .combinedcsvs.csv -Delimiter ';' -NoTypeInformation
Lid Url Type Pid
--- --- ---- ---
L5020 http://linktosite.de URL P555
L100 http://sitelink.de URL P523
L50 http://abcde.de URL P53
L511 http://bbcccddeee.de URL P540
L300 http://link123456.de URL
L5450 http://randomlink.de URL_DE
L5460 http://randomwebsitelink.de URL_DE
如果只想组合两个文件都包含数据的行,可以执行以下操作:
$f1 = Get-Content file1.txt
$f2 = Get-Content file2.txt
$output = for ($i = 0; $i -lt [math]::Min($f1.count,$f2.count); $i++) {
$f2[$i],$f1[$i] -join '|'
}
$output | Set-Content newfile.txt
如果你想合并所有重合的行,再加上从其中一个文件中添加额外的行,你可以执行以下操作:
$output = for ($i = 0; $i -lt [math]::Max($f1.count,$f2.count); $i++) {
if ($f1[$i] -and $f2[$i]) {
$f2[$i],$f1[$i] -join '|'
}
else {
$f2[$i],$f1[$i] | Where {$_}
}
}
$output | Set-Content newfile.txt