我需要从一个巨大的管道分隔文件(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"
答案 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