Чтение в файле * HUGE * CSV, экспорт столбцов спецификаций c на основе имени столбца в заголовке, вывод данных с разделителями-запятыми - PullRequest
1 голос
/ 16 марта 2020

Итак, я знаю, что могу читать в csv-файле, используя import-csv, вот так:

$test = import-csv BPUSAUV20FARS-1000.csv

Я нашел другой вопрос переполнения стека, который дал мне некоторый код для расшифровки имен столбцов, например:

$columns = $test[0].psobject.properties.name

Я нашел сообщение Reddit, которое помогло мне найти способ извлечения нескольких столбцов с использованием select-object, например так:

$properties = @('Index', 'Year', 'Day', 'Time', 'Line', 'Beam', 'Pos TPU', 'Depth TPU', 'Status')

$test |Select-Object $properties

Но вывод команды выше выглядит примерно так:

Index     : 1
Year      : EM2040-0073-1000-20200224-222235
Day       : 25
Time      : Accept
Line      : 0.648
Beam      : 24-FEB-2020:22:22:34.98
Pos TPU   : 4.617
Depth TPU : 1124834.70
Status    : 10247261.01

Index     : 2
Year      : EM2040-0073-1000-20200224-222235
Day       : 26
Time      : Accept
Line      : 0.749
Beam      : 24-FEB-2020:22:22:34.98
Pos TPU   : 4.617
Depth TPU : 1124834.73
Status    : 10247261.76

Index     : 3
Year      : EM2040-0073-1000-20200224-222235
Day       : 27
Time      : Accept
Line      : 0.624
Beam      : 24-FEB-2020:22:22:34.98
Pos TPU   : 4.617
Depth TPU : 1124834.76
Status    : 10247263.05

И что мне нужно, это:

1,EM2040-0073-1000-20200224-222235,25,Accept,0.648,24-FEB-2020:22:22:34.98,4.617,1124834.70,10247261.01

Мне также нужно иметь возможность выполнять эти действия над несколькими сотнями файлов с несколькими миллионами строк в каждом. Самый маленький файл - около 2,4 миллиона строк.

1 Ответ

0 голосов
/ 16 марта 2020

Что касается ...

Мне также нужно иметь возможность выполнять эти действия над несколькими сотнями файлов по несколько миллионов строк в каждом. Самый маленький файл - около 2,4 миллиона строк.

... работа с большими файлами вообще --- (слишком долго для комментария)

Согласно MSDN [IO.File] :: OpenText и, как отмечено в другом Q & A

Командлет Get-Content не работает так же хорошо, как StreamReader при работе с очень большими файлы. Вы можете читать файл построчно, используя StreamReader, например:

$path = 'C:\A-Very-Large-File.txt'
$r = [IO.File]::OpenText($path)
while ($r.Peek() -ge 0) {
    $line = $r.ReadLine()
    # Process $line here...
}
$r.Dispose()
Some performance comparisons:

Measure-Command {Get-Content .\512MB.txt > $null}

Total Seconds: 49.4742533

Measure-Command {
    $r = [IO.File]::OpenText('512MB.txt')
    while ($r.Peek() -ge 0) {
        $r.ReadLine() > $null
    }
    $r.Dispose()
}

Total Seconds: 27.666803
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...