Parsing 向具有空列和可变长度列的非分隔文本文件添加选项卡

Parsing 向具有空列和可变长度列的非分隔文本文件添加选项卡,parsing,powershell,Parsing,Powershell,我有一个不带分隔符的文本文件,希望对其进行解析,以便在特定位置添加选项卡来分隔列。这些列有时是空的或长度不同,这就是为什么我需要在这些特定点上添加选项卡的原因。几年前,我曾在网上使用batch找到过这个问题的答案,但现在找不到它或代码。我已经有了以下代码来替换文件中的2个以上的空格,但这并不能解释列为空的情况 gc $FileToOpen | % { $_ -replace ' +',"`t" } | set-content $FileToSave 因此,我需要阅读每一行,但只能阅读其中的

我有一个不带分隔符的文本文件,希望对其进行解析,以便在特定位置添加选项卡来分隔列。这些列有时是空的或长度不同,这就是为什么我需要在这些特定点上添加选项卡的原因。几年前,我曾在网上使用batch找到过这个问题的答案,但现在找不到它或代码。我已经有了以下代码来替换文件中的2个以上的空格,但这并不能解释列为空的情况

gc $FileToOpen | % { $_ -replace '  +',"`t" } | set-content $FileToSave 
因此,我需要阅读每一行,但只能阅读其中的一部分(一定数量的字符),并在每一部分之后添加制表符

这是数据文件的一个示例,顶行是标题,数据行之间没有空行:

MRUN编号名称X异常原因数据CDM#数量D.O.S
00000000000000名称W修饰符在没有2015年8月13日的情况下无法提交00000000 08/13/2015
00000000000000名称W修饰符不能在没有0000000 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:\path\to\input.txt' |
  ? { $_ -match '^(.{6})(.{4})(.{4})$' } |
  % { "{0}`t{1}`t{2}" -f $matches[1].Trim(), $matches[2].Trim(), $matches[3].Trim() } |
  Set-Content 'C:\path\to\output.txt'
正则表达式按字符数定义列,并以组(括号)的形式捕获它们。然后,这些组可以作为生成的
$matches
集合的索引1及以上进行访问。修剪将删除前导/尾随空格。(
-f
)然后将修剪后的值插入到制表符分隔的格式字符串中


如果最后一列的宽度可变(因为它的值向左对齐并且没有尾随空格),您可能需要将正则表达式更改为
^(.{6})(.{4})(.{,4})$
,以解决这个问题。量词
{,4}
(或
{0,4}
)的意思是前面表达式的四倍。

你说得对,Ansgar,尽管我更多的是寻找想法(帮助),而不是期望有人为我编写代码。文件的列总是从每行的特定位置开始,如果列为空,则只有空格填充到下一列开始。列的宽度不同,但每列之间始终至少有2个空格。正则表达式中的字符计数之和为181。您的示例输入只有130个字符宽。请提供有效的示例输入和您从中获得的输出。确保两个样本缩进正好4个空格,这样它们的格式就正确了。您可能会混淆敏感数据,但请确保不要更改行的长度。2到3行就足够了。谢谢Ansgar,脚本确实处理了空格。问题出在我这边,因为我将文件导入excel,excel将连续分隔符视为一个。这看起来太棒了!%行上发生了什么,这两个选项卡是什么?@LawrenceKnowlton
%
是的别名,用于循环管道中的元素
{0}`t{1}`t{2}
是(
-f
)的格式字符串。好的,我仍然不确定为什么在格式字符串中有两个选项卡。链接没有为格式化操作员讨论这一点。这让我觉得匹配数组中每个元素的前后都会有一个制表符。@LawrenceKnowlton文件是逐行处理的,所以格式字符串是整行的。我的示例输入文件有3列固定宽度。输出文件应该用制表符分隔这些列。3列表示2个分隔选项卡。对于n列,您需要n-1个选项卡。啊,我知道了!明亮的谢谢你的解释!