【发布时间】:2014-09-15 02:57:29
【问题描述】:
我的数据文件 (.txt) 有 31 个字段/列的记录,每个字段是用竖线分隔的。不知何故,很少有记录被损坏(记录被分成多行)。
任何人都可以指导编写一个脚本来读取这个输入数据文件并将其形成一个包含每条记录中正好 31 个字段的文件吗?
PS:我是 powershell 新手。
样本数据:
良好的数据 - 整条记录显示在一行中。
错误数据 - 记录被分成多行。
以下是记录的结构。
11/16/2007||0007327| 3904|1000|M1||CCM|12/31/2009|000|East 89th Street|01CM1| 11073|DONALD INC|001|Project 077|14481623.8100|0.0000|1.00000|1|EA|September 2007 Invoice|Project 027||000000000000|1330|11/16/2007|X||11/29/2007|2144.57
这是我尝试过的,但脚本挂起
#Setup paths
$Input = "Path\Input.txt"
$Output = "Path\Output.txt"
#Create empty variables to set types
$Record=""
$Collection = @()
#Loop through text file
gc Path\Input.txt | %{
$Record = "$Record$_"
If($Record -Match "(\d{1,2}/\d{1,2}/\d{4}(?:\|.*?){31})(\d{1,2}/\d{1,2}/\d{4}\|.*?\|.*)"){
$Collection+=$Matches[1]
$Record=$Matches[2]
}
}
#Add last record to the collection
$Collection+=$Record $Collection | Out-File $Output
【问题讨论】:
-
请举例说明 1) 损坏情况是什么样的(缺少字段?记录分成多行?)和 2) 您尝试解决的问题你自己的。
-
这似乎很熟悉。您是否尝试将 SSMS 中的 SQL 查询结果保存到 CSV?其中一个字段中的换行符会破坏 csv 文件。
-
@FrodeF。不,我只是在处理 .txt 文件。
-
$Record=$Matches[2]行似乎没有做任何事情。当循环以"$Record$_"重新启动时,您将覆盖其内容 -
这部分正则表达式似乎是一个问题(我可能错了)。
(?:\|.*?){31}我读这篇文章是因为您在寻找|后跟 0 个或更多不贪婪的字符 31 次。有没有可能你的意思是(?:\|).{31}。你想在那里完成什么。 regex101.com/r/qY1jZ7/1 是测试正则表达式字符串的好资源。看来您也有不必要的反斜杠
标签: powershell