将至少两个具有不同行的文本文件转换为一个csv-powershell



我正在尝试使用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

或者在所有三个(LidUrlType(属性上:

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

最新更新