2015-08-15 50 views
1

我有一個非分隔文本文件,並且希望解析它以在特定位置添加製表符來分隔列。這些列有時爲空或長度不同,這就是爲什麼我需要爲這些特定點添加製表符。幾年前,我在網上找到了使用批次的答案,但現在找不到它或代碼。我已經有了下面的代碼來替換文件中的兩個以上的空格,但是這並不代表這些列是空的時候。將製表符添加到具有空列和可變長度列的非分隔文本文件中

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 

第二數據行缺少數據。

使用安斯加爾的回答,我的代碼,並找到空字段:

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 

感謝您的耐心安斯加爾,我知道,我試了一下!我真的很感謝幫助!

+0

你是對的Ansgar,雖然我更期待的想法(援助)比期望有人爲我寫代碼。 –

+0

文件的列總是從每行的特定位置開始,如果列爲空,則只有空格填充到下一列的起始位置。列的寬度不相同,但每列之間至少有2個空格。 –

+0

正則表達式中字符計數的總和爲181.您的示例輸入只有130個字符寬。請提供有效的樣本輸入*和*您從中獲得的輸出。確保兩個樣本都縮進了4個空格,所以它們的格式正確。您可能會混淆敏感數據,但請確保不要更改行的長度。 2或3條線就足夠了。 –

回答

2

由於您似乎有一個包含固定寬度列的輸入文件,因此您應該使用正則表達式將輸入轉換爲製表符分隔的格式。

假設以下的輸入文件:

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和以上來訪問。修剪刪除前導/尾隨空白。 format operator-f)然後將修剪後的值插入到製表符分隔的格式字符串中。

如果最後一列的寬度是可變的(因爲它的值與左邊對齊,並且沒有尾隨空格),您可能需要將正則表達式更改爲^(.{6})(.{4})(.{,4})$以解決該問題。量詞{,4}(或{0,4})意味着前面表達的四倍。

+0

這看起來很棒! %行上發生了什麼,兩個標籤有什麼關係? –

+0

@ LawrenceKnowlton'%'是['ForEach-Object']的一個別名(https://technet.microsoft.com/en-us/library/hh849731.aspx),它用於循環管道中的元素。 '{0}'t {1}'t {2}''是[格式運算符]的格式字符串(http://social.technet.microsoft.com/wiki/contents/articles/7855.using- -f-format-operator-in-powershell.aspx)('-f')。 –

+0

好吧,我仍然不確定爲什麼你在格式字符串中有兩個選項卡。該鏈接沒有討論格式運算符。這讓我覺得在匹配數組中的每個元素的前面和後面都會有一個選項卡。 –

相關問題