导入平面文件固定宽度 - 建议

时间:2013-12-21 21:41:34

标签: perl powershell flat-file fixed-width

我正在读取一个平面文件(固定宽度字段),以便我可以将其导入SQLServer。这是我公司的一个新项目。我还没有以最节省时间和最快速的方式解析大文件。在互联网上搜索,我找到了一个可以解析固定宽度文件的powershell脚本......它可以解析文件。

[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') 

$Parser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser( 
'C:\T1046436.dat') 

$Parser.TextFieldType = 'FixedWidth' 
$Parser.TrimWhiteSpace = $False 
$Parser.FieldWidths = @(13,6,11,2,10,10,1,1,7,7,2,17,1,2,2,4,1,10,10,10,10,2,10,10,11,2,2,1,1) 

while(!$Parser.EndOfData) 
{ 
try 
{ 
    Write-Host $Parser.ReadFields() 
} 
catch [Microsoft.VisualBasic.FileIO.MalformedLineException] 
{ 
    Write-Host "Error, line $($_.Exception.LineNumber): $($Parser.ErrorLine)" 
} 
} 

我希望能够将它保存在一个以管道分隔的文件中,这样我就可以简单地在sql数据库中使用BCP。这是我加载数据的快速方法。但是,它耗费了大量时间(50000条记录需要20分钟)。

快速/有效地提出建议的任何建议:

  • 转换为竖线分隔文件 OR
  • 从powershell直接将平面文件导入SQL服务器... OR
  • 我愿意使用任何其他脚本语言来帮助快速将平面文件解析为Windows下的管道分隔文件(python,perl等)。将使用任何示例脚本。

1 个答案:

答案 0 :(得分:0)

这个Powershell脚本将解析包含5个字段记录的$文件集合,每个字段有10个字符,并输出带有管道分隔字段的记录。

#Create a regular expression to match the field widths and capture the data.
$regex = [regex]'(.{10})(.{10})(.{10})(.{10})(.{10})'

#create a filter to insert a pipe character between the captured groups.
filter PipeDelimit {$_ -replace $regex, '$1|$2|$3|$4|$5'}


#Pipe the records thorough the filter in batches of 1000 
Get-Content $files -ReadCount 1000 | Pipedelimit

您需要修改正则表达式并过滤以匹配您的数据。我怀疑咀嚼50万条记录需要花费不到20分钟的时间。

-Readcount将通过在管道中一次只保留1000条记录来控制内存使用量。它们将作为数组传递给管道,过滤器中的-replace运算符将在一次操作中分隔整个数组,而不需要foreach遍历每条记录。 filter被认为是不寻常的,可以替换为foreach-object,但filter稍微快一些,如果你做了很多代表,它会加起来。