从管道分隔的文本文件中提取列并使用Powershell输出

时间:2019-01-24 16:52:21

标签: sql excel powershell

我需要从一个巨大的管道分隔文件(100 MB-3GB)中提取2列(第147列和第148列)。我无法在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 WHERE,因为该表根据传入的源而有所不同。

我正在使用以下代码,但它不会打印输出文件中的列,而仅显示标题:

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 :(得分:2)

这可能是最快的选择(?)

由于文件非常大,因此它使用一些.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()
}

答案 1 :(得分:1)

具有纯内置PowerShell cmdlet的替代解决方案。我不能说大型文件的性能如何。可能比我的其他答案差。您应该尝试一下。

此外,这要求输入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