【发布时间】:2016-01-13 21:36:46
【问题描述】:
我有 2 个 csv 文件
第一个文件:
firstName,secondName
1234,Value1
2345,Value1
3456,Value1
4567,Value3
7645,Value3
第二个文件:
firstName,fileSplitter,Csv2ColumnOne,Csv2ColumnTwo,Csv2ColumnThree
1234,,1234,abc,Value1
1234,,1234,asd,Value1
3456,,3456,qwe,Value1
4567,,4567,mnb,Value1
我想在firstName 和fileSplitter 列之间的第二个文件中插入列secondName。
结果应该是这样的:
firstName,secondName,fileSplitter,Csv2ColumnOne,Csv2ColumnTwo,Csv2ColumnThree
1234,Value1,,1234,abc,Value1
1234,Value1,,1234,asd,Value1
3456,Value1,,3456,qwe,Value1
4567,Value3,,4567,mnb,Value1
我正在尝试以下代码:
Function InsertColumnInBetweenColumns
{
Param ($FirstFileFirstColumnTitle, $firstFile, [string]$1stColumnName, [string]$2ndColumnName, [string]$columnMergedFileBeforeInput)
Write-Host "Creating hash table with columns values `"$1stColumnName`" `"$2ndColumnName`" From $OimFileWithMatches"
$hashFirstFileTwoColumns = @{}
Import-Csv $firstFile | ForEach-Object {$hashFirstFileTwoColumns[$_.$1stColumnName] = $_.$2ndColumnName}
Write-Host "Complete."
Write-Host "Appending Merge file with column `"$2ndColumnName`" from file $secondCsvFileWithLocalPath"
Import-Csv $outputCsvFileWithLocalPath | Select-Object $columnMergedFileBeforeInput, @{n=$2ndColumnName; e={
if ($hashFirstFileTwoColumns.ContainsKey($_.$FirstFileFirstColumnTitle)) {
$hashFirstFileTwoColumns[$_.$FirstFileFirstColumnTitle]
} Else {
'Not Found'
}}}, * | Export-Csv "$outputCsvFileWithLocalPath-temp" -NoType -Force
Move-Item "$outputCsvFileWithLocalPath-temp" $outputCsvFileWithLocalPath -Force
Write-Host "Complete."
Write-Host ""
}
该函数将在第一个文件中找到的每一列的 for 循环中调用(可以包含不定数字)。为了测试,我只使用第一个文件中的 2 列。
我收到一个错误输出,结果如下:
Select : Property cannot be processed because property "firstName" already exists.
At C:\Scripts\Tests\Compare2CsvFilesOutput1WithMatchesOnly.ps1:490 char:43
+ Import-Csv $outputCsvFileWithLocalPath | Select $columnMergedFileBeforeInput, @ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (@{firstName=L...ntName=asdfas}:PSObject) [Select-Object], PSArgume
ntException
+ FullyQualifiedErrorId : AlreadyExistingUserSpecifiedPropertyNoExpand,Microsoft.PowerShell.Commands.SelectObjectC
ommand
我知道问题出在Select-Object $columnMergedFileBeforeInput, 的位置。
如何让循环语句在前列之间插入列(指定名称),并使用* 附加其余列?
更新
仅供参考,将这一行 Select-Object $columnMergedFileBeforeInput, @{n=$2ndColumnName..... 更改为这一行 Select-Object @{n=$2ndColumnName..... 有效,它只是无序地附加列。这就是我试图在两者之间插入列的原因。也许如果我这样做但使用 for 循环向后插入列,这将工作......
【问题讨论】:
-
您的预期输出没有意义。文件 1 有 5 条记录,最后一条是指
Value3与7645关联。文件 2 有 4 条记录,并且没有引用其中任何一个值,但不知何故,您的预期输出包括Value3和第四条记录。请用更合理的例子更新问题。 -
您只是逐行进行吗?与 File1 中的 Record 2 一样,无论内容如何,都会与 File2 中的 Record 2 合并?两个文件的记录数是否相同?这可能是
For($i=0;$i -lt $file1.count;$i++){}循环的工作。 -
更新了第一个有问题的文件。两个文件中的记录数量可以相同也可以不同。
-
您的错误表明您试图拥有两个名称为“firstname”的属性。扩展变量后,您似乎正在有效地执行以下操作:
Select firstname,firstname,*因此,如果属性名称存在冲突,应该赢取什么? -
是的,
firstName列之前已添加到 test2.csv 文件中,以将值与Csv2ColumnOne列匹配。现在找到的值匹配已添加为 test2.csv 文件中的第一列firstName,我们需要插入 test1.csv 文件中的第二列以匹配 test2.csv 中第一列firstName中的行.