Импортировать столбец из нескольких csv-файлов в новый csv powershell

#powershell #csv #export-to-csv

#powershell #csv #экспорт в csv

Вопрос:

Привет, я новичок и очень плохо разбираюсь в powershell.

У меня есть 5 CSV-файлов, в каждом из которых есть 1 столбец. Я хочу взять столбец из каждого файла csv и поместить их в новый файл csv, и каждый столбец будет взят из 5 файлов csv в качестве отдельного столбца в новом csv

результат должен быть таким

 temp1 | temp2 | temp3 | temp4 | temp5|
  

может ли кто-нибудь, пожалуйста, помочь мне с этим

Комментарии:

1. Что вы уже пробовали? Пожалуйста, покажите свой код.

2. предполагая, что все они имеют одинаковое количество строк… загрузите файлы в независимые $ Vars, выполните итерацию по одному из них, создайте PSCustomObject который имеет prop из каждого $ Var, затем экспортируйте это в CSV-файл.

3. Есть ли у какого-либо из этих входных CSV-файлов (или у всех них) заголовок, или это просто списки значений, каждое в новой строке?

Ответ №1:

Это должно сработать. Это данные, разделенные запятыми. Я не мог сказать, хотите ли вы, чтобы разделители канала были основаны на вашем вопросе или это было для демонстрационных целей. Я также не смог определить, была ли временная номенклатура новым значением столбцов, которые вы хотели, или это уже было имя каждого столбца в каждом файле. Предполагается, что в ваших данных нет запятых.

 $CSV1 = Get-Content csv1.csv
$CSV2 = Get-Content csv2.csv
$CSV3 = Get-Content csv3.csv
$CSV4 = Get-Content csv4.csv
$CSV5 = Get-Content csv5.csv
$MostRows = ($CSV1.count,$CSV2.count,$CSV3.count,$CSV4.count,$CSV5.count | Sort-Object -Descending)[0]

$Output = For ($i = 0; $i -lt $MostRows; $i  ) {
    $CSV1[$i],$CSV2[$i],$CSV3[$i],$CSV4[$i],$CSV5[$i] -Join ","
}

$Output | Set-Content NewCSV.csv
  

Вот альтернатива, которая использует объекты и защищает запятые в данных. При этом для имен столбцов используется ваша временная номенклатура. Это можно вручную настроить на все, что вам нравится, обновив имена в хэш-таблице.

 $CSV1 = Get-Content csv1.csv
$CSV2 = Get-Content csv2.csv
$CSV3 = Get-Content csv3.csv
$CSV4 = Get-Content csv4.csv
$CSV5 = Get-Content csv5.csv
$MostRows = ($CSV1.count,$CSV2.count,$CSV3.count,$CSV4.count,$CSV5.count | Sort-Object -Descending)[0]

$Output = For ($i = 0; $i -lt $MostRows; $i  ) {
    [pscustomobject][ordered]@{"temp1"=$CSV1[$i];"temp2"=$CSV2[$i];"temp3"=$CSV3[$i];"temp4"=$CSV4[$i];"temp5"=$CSV5[$i]}
}

$Output | Export-CSV NewCSV.csv -notypeinformation
  

Комментарии:

1. Предполагается, что входные CSV-файлы вообще не являются CSV-файлами, а представляют собой списки значений без заголовков CSV. Из вопроса без примеров невозможно сказать, действительно ли это так.

2. @Тео, это правильно. Я чувствую, что для составления идеального решения не хватает некоторой важной информации.