Извлекать столбцы из текстового файла с разделителями и выводить их с помощью powershell - PullRequest
0 голосов
/ 24 января 2019

Мне нужно извлечь 2 столбца (столбец 147 и столбец 148) из огромного файла с разделителем каналов (100 МБ-3 ГБ). Я не могу открыть в Excel или, если я делаю это занимает вечность. Как только столбцы извлечены, мне нужно вывести верхние N строк в другой текстовый файл, но мне нужно отформатировать их, чтобы они могли быть помещены в SQL, чтобы я мог запросить таблицу. Однако в двух извлеченных столбцах может быть много объединенных полей, разделенных запятыми (LOGICAL_KEY_CONCAT_FIELD_CLM, LOGICAL_KEY_CONCAT_FIELD_CLM2), и их формат может варьироваться от файла к файлу. Мне нужно, чтобы это был повторяющийся процесс.

Например, файл с разделителями трубы выглядит так:

|||…|LOGICAL_KEY_CONCAT_FIELD_CLM|LOGICAL_KEY_CONCAT_FIELD_CLM2|||||…
|||…|CLM,KEY,1|CLM,FINANCIAL,KEY,1,2018-11-30|||…
|||…|CLM,KEY,2|CLM,FINANCIAL,KEY,2,2018-11-30|||…
|||…|CLM,KEY,3|CLM,FINANCIAL,KEY,3,2018-11-30|||…
.
.
.

ВЫВОД:

(LOGICAL_KEY_CONCAT_FIELD_CLM = 'CLM,KEY,1' AND 
LOGICAL_KEY_CONCAT_FIELD_CLM2 = 'CLM,FINANCIAL,KEY,1,2018-11-30')
OR (LOGICAL_KEY_CONCAT_FIELD_CLM = 'CLM,KEY,2' AND 
LOGICAL_KEY_CONCAT_FIELD_CLM2 = 'CLM,FINANCIAL,KEY,2,2018-11-30')
OR (LOGICAL_KEY_CONCAT_FIELD_CLM = 'CLM,KEY,3' AND 
LOGICAL_KEY_CONCAT_FIELD_CLM2 = 'CLM,FINANCIAL,KEY,3,2018-11-30')

По сути, я хочу выполнить запрос, используя данные из столбцов в файле, и хочу убедиться, что комбинация LOGICAL_KEY_CONCAT_FIELD_CLM и LOGICAL_KEY_CONCAT_FIELD_CLM2 находятся в таблице. Мне не нужно SELECT * FROM Table, ГДЕ, потому что таблица меняется в зависимости от входящего источника.

Я использую следующий код, но он не печатает столбцы в выходном файле, только заголовки:

Get-Content "\\LocationOfFile\CLAIM_20190103T17053920.txt" | select-object 
LOGICAL_KEY_CONCAT_FIELD_CLM,LOGICAL_KEY_CONCAT_FIELD_CLM2 -First 10 | Out- 
File "P:\PDS_QA\TestFile\Output.txt"

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

Кроме того, для этого требуется, чтобы у входного CSV был заголовок с уникальными именами для каждого столбца.

$infile = "\\LocationOfFile\CLAIM_20190103T17053920.txt"
$outfile = "P:\PDS_QA\TestFile\Output.txt"
"SELECT * FROM Table WHERE 1=0" | Out-File $outfile
Import-Csv $infile -Delimiter "|" | foreach {
    "OR (LOGICAL_KEY_CONCAT_FIELD_CLM = '{0}' AND LOGICAL_KEY_CONCAT_FIELD_CLM2 = '{1}')" -f (
    $_.LOGICAL_KEY_CONCAT_FIELD_CLM,
    $_.LOGICAL_KEY_CONCAT_FIELD_CLM2)
} | Out-File $outfile -Append
0 голосов
/ 24 января 2019

Это, пожалуй, самый быстрый вариант (?)

Поскольку ваш файл очень большой, для оптимальной производительности он использует несколько потоков .NET:

$outstream = New-Object System.IO.StreamWriter "P:\PDS_QA\TestFile\Output.txt"
try {
    $outstream.WriteLine("SELECT * FROM Table WHERE 1=0")
    $firstLine = $true
    foreach ($line in [System.IO.File]::ReadLines("\\LocationOfFile\CLAIM_20190103T17053920.txt")) {
        if ($firstLine) {
            # skip the header of the file
            $firstLine = $false
            continue
        }
        $values = $line.Split("|")
        # (-1 because I assume your column numbers are one-based)
        $clm, $clm2 = $values[146, 147]
        $line = "OR (LOGICAL_KEY_CONCAT_FIELD_CLM = '{0}' AND LOGICAL_KEY_CONCAT_FIELD_CLM2 = '{1}')" -f $clm, $clm2
        $outstream.WriteLine($line)
    }
}
finally {
    $outstream.Dispose()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...