向具有空列和可变长度列的非分隔文本文件添加制表符



我有一个非分隔的文本文件,我想对它进行解析,以便在特定位置添加制表符来分隔列。这些列有时是空的或长度不同,这就是为什么我需要在这些特定的位置添加制表符。几年前,我在网上使用批处理找到了这个问题的答案,但现在找不到它或代码。我已经有了下面的代码来替换文件中超过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})最多表示前面表达式的四倍。

最新更新