Добавить новый 1-й столбец в CSV на основе имени файла - PullRequest
1 голос
/ 01 апреля 2020

У меня есть папка с 500 CSV-файлами в каждой с приложением 80.000 строк. Мне нужно добавить дату (на основе имени файла) в 1-й столбец.

Сценарий, который я взял из различных образцов, делает почти то, что должен. Он создает новый файл для каждого в папке с новым столбцом на 1-м месте с правильным именем заголовка, но все строки в этом столбце пусты.

Пример имени файла: 2020-03-31_xxxxxxxx.csv

Было бы замечательно, если бы кто-то мог взглянуть на это.

$items = Get-ChildItem -Path "C:\Temp\Data\*.csv"

for ($i=0; $i -lt $items.Count; $i++)

{

$outfile = $items[$i].FullName + "out"

Import-Csv $items | 

Select-Object @{Name='Date';Expression={Get-ChildItem -Name $items.Name.SubString(0,9)}},* | 
Export-Csv -NoTypeInformation -delimiter ";” $outfile

}

Также в экспорте должно быть преобразование для отсутствия "" в CSV, но я также не возможность добавить это, не получая ошибок.

(ConvertTo-Csv -NoTypeInformation -delimiter ";”) | Foreach-Object { $_ -replace  '"', '' } | Out-File $outfile

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Попробуйте:

$items = Get-ChildItem -Path "C:\Temp\Data\*.csv" 
for ($i=0; $i -lt $items.Count; $i++) { 

$outfile = $items[$i].FullName + "out" 

Import-Csv $items[$i] | Select-Object @{n='Date';e={$items[$i].Fullname.ToString().Split("_")[0]}},* | Export-Csv -NoTypeInformation -delimiter ";” -Force $outfile 
}

Вы не выбирали дату, но получали информацию о дочернем элементе каждого файла. Таким образом, вы получили безобразно отформатированный CSV. Также вы импортировали все CSV одновременно, а не один.

0 голосов
/ 01 апреля 2020

Благодаря Васифу Хасану я получил этот код. Кавычки не нужно удалять, так как в CSV есть текстовые поля, которые будут ломаться, если я попытаюсь удалить qoutes:

$items = Get-ChildItem -Path "C:\Temp\Data\*.csv" 
for ($i=0; $i -lt $items.Count; $i++) { 

$outfile = $items[$i].FullName + "out" 

$delimiter = ';'

Import-Csv $items[$i] -delimiter $delimiter | Select-Object @{n='Date';e= 
{$items[$i].Basename.ToString().Split("_")[0]}},* |  Export-Csv - 
NoTypeInformation -delimiter $delimiter -Force $outfile 

}
...