我有一个非分隔的文本文件,我想对它进行解析,以便在特定位置添加制表符来分隔列。这些列有时是空的或长度不同,这就是为什么我需要在这些特定的位置添加制表符。几年前,我在网上使用批处理找到了这个问题的答案,但现在找不到它或代码。我已经有了下面的代码来替换文件中超过2个空格,但这并没有考虑到列为空的情况。
gc $FileToOpen | % { $_ -replace ' +',"`t" } | set-content $FileToSave
所以,我需要读取每行,但只能读取一部分(一定数量的字符),并在每个部分之后添加制表符。
下面是一个数据文件的示例,顶部行是标题,数据行之间没有空行:
MRUN Number Name X Exception Reason Data CDM# Quantity D.O.S
000000 00000000 Name W MODIFIER CANNOT BE FILED WITHOUT 08/13/2015 0000000 0 08/13/2015
000000 00000000 Name W MODIFIER CANNOT BE FILED WITHOUT 0000000 0 08/13/2015
第二行数据缺失。
使用Ansgar的答案,我的代码确实找到了空字段:
gc $FileToOpen |
? { $_ -match '^(.{8})(.{12})(.{20})(.{3})(.{34})(.{62})(.{10})(.{22})(.{10})$' } |
% { "{0}`t{1}`t{2}`t{3}`t{4}`t{5}`t{6}`t{7}`t{8}" -f $matches[1].Trim(), $matches[2].Trim(), $matches[3].Trim(), $matches[4].Trim(), $matches[5].Trim(), $matches[6].Trim(), $matches[7].Trim(), $matches[8].Trim(), $matches[9].Trim() } |
Set-Content $FileToSave
谢谢你的耐心,我知道我试过了!我真的很感谢你的帮助! 由于您的输入文件似乎具有固定宽度的列,因此您可能应该使用正则表达式将输入转换为制表符分隔的格式。
假设输入文件如下:
A B C
foo 13 22
bar 4 17
baz 142 23
文件有3列。第一列宽6个字符,另外两列各4个字符。
这个转换可以用像这样的正则表达式来完成:
Get-Content 'C:pathtoinput.txt' |
? { $_ -match '^(.{6})(.{4})(.{4})$' } |
% { "{0}`t{1}`t{2}" -f $matches[1].Trim(), $matches[2].Trim(), $matches[3].Trim() } |
Set-Content 'C:pathtooutput.txt'
正则表达式根据字符数定义列,并将它们分组捕获(括号)。然后可以将这些组作为结果$matches
集合的索引1及以上的索引访问。微调将删除前导/尾随空格。然后,格式操作符(-f
)将裁剪后的值插入制表符分隔的格式字符串中。
如果最后一列有一个可变的宽度(因为它的值向左对齐,没有尾随空格),你可能需要将正则表达式更改为^(.{6})(.{4})(.{,4})$
来处理这一点。量词{,4}
(或{0,4}
)最多表示前面表达式的四倍。