【发布时间】:2019-11-08 20:41:01
【问题描述】:
我每月都会收到几个非常大(~ 4 GB)的固定列宽文本文件,需要导入到 MS SQL Server 中。要导入文件,必须将文件转换为具有制表符分隔的列值的文本文件,并从每个列值中删除空格(某些列没有空格)。我想使用 PowerShell 来解决这个问题,并且我希望代码非常非常快。
我尝试了多次代码迭代,但到目前为止太慢或无法正常工作。我试过微软文本解析器(太慢了)。我试过正则表达式匹配。我正在使用安装了 PowerShell 5.1 的 Windows 7 机器。
ID FIRST_NAME LAST_NAME COLUMN_NM_TOO_LON5THCOLUMN
10000000001MINNIE MOUSE COLUMN VALUE LONGSTARTS
$infile = "C:\Testing\IN_AND_OUT_FILES\srctst.txt"
$outfile = "C:\Testing\IN_AND_OUT_FILES\outtst.txt"
$batch = 1
[regex]$match_regex = '^(.{10})(.{50})(.{50})(.{50})(.{50})(.{3})(.{8})(.{4})(.{50})(.{2})(.{30})(.{6})(.{3})(.{4})(.{25})(.{2})(.{10})(.{3})(.{8})(.{4})(.{50})(.{2})(.{30})(.{6})(.{3})(.{2})(.{25})(.{2})(.{10})(.{3})(.{10})(.{10})(.{10})(.{2})(.{10})(.{50})(.{50})(.{50})(.{50})(.{8})(.{4})(.{50})(.{2})(.{30})(.{6})(.{3})(.{2})(.{25})(.{2})(.{10})(.{3})(.{4})(.{2})(.{4})(.{10})(.{38})(.{38})(.{15})(.{1})(.{10})(.{2})(.{10})(.{10})(.{10})(.{10})(.{38})(.{38})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})(.{10})$'
[regex]$replace_regex = "`${1}`t`${2}`t`${3}`t`${4}`t`${5}`t`${6}`t`${7}`t`${8}`t`${9}`t`${10}`t`${11}`t`${12}`t`${13}`t`${14}`t`${15}`t`${16}`t`${17}`t`${18}`t`${19}`t`${20}`t`${21}`t`${22}`t`${23}`t`${24}`t`${25}`t`${26}`t`${27}`t`${28}`t`${29}`t`${30}`t`${31}`t`${32}`t`${33}"
Get-Content $infile -ReadCount $batch |
foreach {
$_ -replace $match_regex, $replace_regex | Out-File $outfile -Append
}
感谢您提供的任何帮助!
【问题讨论】:
-
$element = $_.trim()不会产生任何结果,因为您没有使用foreach-object。$element = $element.trim()会产生更好的结果。 -
如果要将列表转换为制表符分隔的字符串,只需使用
$list -join "`t"。 -
[1]
-ReadCount默认为1,因此您不会以这种方式获得任何东西。 [grin] [2]\t在 PoSh 中对于使用反引号而不是斜线的选项卡无效。它可能在 dotnet[regex]调用中起作用,尽管如此。 [3]你看过StreamReader了吗?这是快速文本文件读/写的通常建议。 [4] 你可以使用$Matches[1..($Matches.Count -1)] -join "t"` [在前面的代码中t之前应该有一个反引号而不是一个空格]从捕获组中构建你的制表符分隔字符串。 -
不要使用
$Input,作为普通变量,它在PowerShell中被保留为automatic variable。 -
@Mark 表示感谢,但请注意,要让此处的评论者收到您的后续评论通知,您必须@-提及他们,但问题是您只能@-提及 一个 用户 - 请参阅 meta.stackexchange.com/a/43020/248777
标签: c# .net regex powershell