Import-Csv, измените 1 поле, затем экспортируйте - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть данные (с разделителями табуляции) в следующем формате:

Id      Dates                        Number
5       01-01-18<space><tab>         19
5       01-01-18 02-03-18            19
5       01-01-18 02-03-18 03-02-18   19
37      07-09-18                     19
37      07-09-18 07-15-18            19
37      07-09-18 07-15-18 07-28-18   18.1
41      03-15-18                     19
41      03-15-18 04-15-18            19
41      03-15-18 04-15-18 05-15-18   36.5

Вторые поля Dates на самом деле массив (с пробелами) с конечным пробелом.

Мне нужно импортировать это в PowerShell и экспортировать в новый файл CSV после изменения второго поля, чтобы включить только последнюю дату:

Id      Dates      Number
5       01-01-18   19
5       02-03-18   19
5       03-02-18   19
37      07-09-18   19
37      07-15-18   19
37      07-28-18   18.1
41      03-15-18   19
41      04-15-18   19
41      05-15-18   36.5

Я не смог получить ничего, кроме ошибок после итерациизаписей (поэтому у меня нет полу-рабочего кода для публикации вместе с этим).

CSV-файл может содержать до 100 000 записей.


Итак, я получил это такfar:

$ImportDir = "input_dir"
$ExportDir = "output_dir"

# We only want the files generated yesterday
$Date = (Get-Date).AddDays(-1).ToString('yyyyMMdd')

Add-Content ($ExportDir + "blahblah_" + $Date + ".txt") "Id`tDate`tValue"

Get-ChildItem $ImportDir -Filter *_blahblah_$Date.txt | ForEach-Object {
    $File = [System.IO.File]::ReadAllText((Resolve-Path $_.FullName))

    foreach ($RecordSet In $File) {
        $RecordSet.TrimEnd() -Replace "(\d+?)`t.*(\d\d-\d\d-\d\d) `t(\d+?.\d+?) `t", "`$1`t`$2`t`$3" |
            #Select-Object -Skip 1 |
            Add-Content ($ExportDir + "blahblah_" + $Date + ".txt")
    }
}

Я перешел на использование [System.IO.File], потому что это было быстрее, чем -ReadCount и -ReadCount как-то терял записи.Последнее, что мне нужно выяснить, это то, как пропустить первую строку каждого файла (в основном я выполняю это регулярное выражение для многих файлов и мне нужно удалить заголовки).Похоже, все, что я делаю, приводит к тому, что скрипт не работает.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Если вы хотите обрабатывать данные как простой текст, и ваш CSV действительно отформатирован так, как вы указали (без кавычек или чего-либо еще), тогда вы можете выполнить регулярное выражение в каждой строке, чтобы получить нужные данные, и этодолжно быть относительно быстро.Он обрабатывает 1000 записей одновременно, но вы можете попробовать поиграть с номером -ReadCount, чтобы посмотреть, сможете ли вы улучшить производительность.Старшие числа используют больше памяти, но должны сделать это быстрее.

ForEach($RecordSet in (Get-Content C:\Path\To\File.csv -ReadCount 1000)){
    $RecordSet -replace "(\S+?)`t.*(\d\d-\d\d-\d\d) `t(.*)$","`$1`t`$2`t`$3" | Add-Content C:\Path\To\NewFile.csv
}
0 голосов
/ 27 ноября 2018

даже если я думаю, что вам нужно будет использовать StreamReader для большого файла, вот как я бы это сделал с Import-CSV.обратите внимание, что это буквально последняя дата в столбце, а не хронологическая последняя дата [ ухмылка ] ...

# fake reading in a CSV file with tab delimiters
#    in real life, use Import-CSV
# each "Dates" column has a trailing <space>
$InStuff = @'
Id  Dates   Number
5   01-01-18    19
5   01-01-18 02-03-18   19
5   01-01-18 02-03-18 03-02-18  19
37  07-09-18    19
37  07-09-18 07-15-18   19
37  07-09-18 07-15-18 07-28-18  18.1
41  03-15-18    19
41  03-15-18 04-15-18   19
41  03-15-18 04-15-18 05-15-18  36.5
'@ | ConvertFrom-Csv -Delimiter "`t"

$LastDateOnly = foreach ($IS_Item in $InStuff)
    {
    [PSCustomObject]@{
        ID = $IS_Item.Id
        Date = $IS_Item.Dates.Trim().Split(' ')[-1]
        Number = $IS_Item.Number
        }
    }

$LastDateOnly

output ...

ID Date     Number
-- ----     ------
5  01-01-18 19    
5  02-03-18 19    
5  03-02-18 19    
37 07-09-18 19    
37 07-15-18 19    
37 07-28-18 18.1  
41 03-15-18 19    
41 04-15-18 19    
41 05-15-18 36.5  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...