У меня есть 1 книга Excel с одним листом и 3 файла CSV.Рабочий лист имеет фиксированное количество столбцов (с заголовками) и различное количество строк.Один столбец содержит поле «ID», а три последних столбца не заполнены.Каждый CSV имеет различное количество столбцов, но у всех есть поле «ID», которое должно соответствовать полю «ID» на листе Excel.Хотя в листе Excel может быть несколько экземпляров одного и того же идентификатора, в CSV нет повторяющихся идентификаторов.Например:
Файл Excel
ID: Name: Color: Location: Age: Siblings:
123 Bob Red
234 Sally Green
345 Donald Orange
123 Bob Black
CSV1
ID: Name: Place: Animal: Location: Car:
123 Bob Here Dog Up Ferarri
234 Sally There Cat Down Porsche
345 Donald Nowhere Squid Right Yugo
CSV2
ID: Name: Place: Age:
123 Bob Here 50
234 Sally There 45
345 Donald Nowhere 100
CSV3
ID: Siblings:
123 Five
234 Three
345 Eight
Цель состоит в том, чтобы добавить данные из определенных столбцов в файлах CSV в файл Excel на основе соответствующих идентификаторов.Ожидаемый результат будет следующий файл Excel:
ID: Name: Color: Location: Age: Siblings:
123 Bob Red Up 50 Five
234 Sally Green Down 45 Three
345 Donald Orange Right 100 Eight
123 Bob Black Up 50 Five
Я потратил довольно много времени, пытаясь найти наиболее эффективный (быстрый) метод для этого и думаю, что я столкнулся с кирпичной стеной.Что у меня есть (в соответствующей части):
# Pull relevant data from csv files together #
$rtFile = $selectedDirectory + "\\" + "*RT*.csv"
$seFile = $selectedDirectory + "\\" + "*SE*.csv"
$lmFile = $selectedDirectory + "\\" + "*LM*.csv"
$rtCSV = Import-Csv $rtFile | select ID, LOCATION
$seCSV = Import-Csv $seFile | select ID, AGE
$lmCSV = Import-Csv $lmFile | select ID, SIBLINGS
$rtCSV | ForEach {$_ | Add-Member 'AGE' $null}
$rtCSV | ForEach {$_ | Add-Member 'SIBLINGS' $null}
foreach ($record in $rtCSV) {
$record.'AGE' = $seCSV | Where {$_.ID -eq $record.ID} | Select -Expand 'AGE'
$Record.'SIBLINGS' = $lmCSV | Where {$_.ID -eq $record.ID} | Select -Expand 'SIBLINGS'
}
# Add Data to Excel Sheet #
$WorkSheet.Activate()
$range = $WorkSheet.Range("C1").EntireColumn
foreach ($searchStr in $rtCSV.ID) {
$search = $range.Find($searchStr)
if ($search -ne $null) {
$firstAdr = $search.Address(0, 0, 1, 0)
do {
$WorkSheet.Cells.Item($search.row,17).Value() = $rtCSV[$search.row].LOCATION
$WorkSheet.Cells.Item($search.row,18).Value() = $rtCSV[$search.row].AGE
$WorkSheet.Cells.Item($search.row,19).Value() = $rtCSV[$search.row].SIBLINGS
$search = $range.FindNext($search)
} while ($search -ne $null -and $search.Address(0, 0, 1, 0) -ne $firstAdr)
}
}
Это заняло у меня некоторое время, но я наконец понял, почему вышеприведенное не работает.Хотя $search.row
возвращает соответствующую строку в документе Excel (и, следовательно, ее можно использовать для определения, в какую ячейку вставлять данные), она не возвращает соответствующий индекс (?) Для соответствующих значений в $rtCSV
.Итак, как мне убедиться, что я вставляю правильные значения для LOCATION, AGE и SIBLINGS каждый раз, когда совпадают идентификаторы?
Если это невозможно в рамках текущей конструкции, есть ли другое (возможно, лучшее и более эффективное)путь?Вообще говоря, файл Excel не должен содержать более 1000 строк.