2016-02-26 1 views
0

Я очень новичок в PowerShell и RegEx и хотел бы помочь. У меня есть файл «print.txt», в котором содержится около 35 000 строк. Меня попросили найти способ конвертировать это в CSV для дальнейшей обработки в Excel.PowerShell + Regex для соответствия и вывода на csv

К сожалению, у меня нет контроля над форматированием print.txt, поэтому я застрял с ним как есть.

Пример из print.txt:

--------- #1157 11/06/2015 09:44:21 Total: 2482.3 --------- 
RCPE: 101 ID: 204 WKOD: 0 OPRT: 0 TARE: 13.6 
MAT  ADDI(2) REGR(4) ADDI(5) ADDI(6) NATU(8) 
       2%  25% 0.5% 1.3% 100 
FINA R  1.89 25.36 0.54 1.31 100.00 
FINA W  33.7 629.4  9.6 23.3 1786.1 
1st DW  22.8 629.4  9.6 23.3 1786.1 
1st DT  79.0 1578.0 3622.0 9753.0 8468.0 
1st FR 449.37 396.19 2.47 2.38 212.82 
DW/DT 288.40 398.88 2.66 2.39 210.93 
FRate 449.37 396.19 2.57 2.38 211.87 
Retry#  02          

--------- #1158 11/06/2015 09:45:40 Total: 2513.7 --------- 
RCPE: 101 ID: 204 WKOD: 0 OPRT: 0 TARE: 12.4 
MAT  ADDI(2) REGR(4) ADDI(5) ADDI(6) NATU(8) 
       2%  25% 0.5% 1.3% 100 
FINA R  1.81 25.48 0.49 1.28 100.00 
FINA W  32.8 640.4  8.8 23.2 1808.4 
1st DW  21.1 640.4  8.8 23.2 1705.8 
1st DT  80.0 1578.0 3524.0 9875.0 8456.0 
1st FR 449.37 396.19 2.57 2.38 211.87 
DW/DT 263.20 405.85 2.51 2.35 201.73 
FRate 449.37 396.19 2.57 2.38 206.80 
Retry#  01         01 

--------- #1159 11/06/2015 09:46:43 Total: 2484.9 --------- 
RCPE: 101 ID: 204 WKOD: 0 OPRT: 0 TARE: 12.3 
MAT  ADDI(2) REGR(4) ADDI(5) ADDI(6) NATU(8) 
       2%  25% 0.5% 1.3% 100 
FINA R  1.83 25.36 0.51 1.26 100.00 
FINA W  32.8 630.2  9.1 22.6 1790.2 
1st DW  24.3 630.2  9.1 22.6 1790.2 
1st DT  80.0 1578.0 3489.0 9775.0 8710.0 
1st FR 449.37 396.19 2.57 2.38 206.80 
DW/DT 303.24 399.39 2.60 2.31 205.53 
FRate 449.37 396.19 2.57 2.38 206.80 
Retry#  01          

--------- #1160 11/06/2015 09:47:58 Total: 2581.8 --------- 
RCPE: 101 ID: 204 WKOD: 0 OPRT: 0 TARE: 12.7 
MAT  ADDI(2) REGR(4) ADDI(5) ADDI(6) NATU(8) 
       2%  25% 0.5% 1.3% 100 
FINA R  1.91 25.06 0.49 1.30 100.00 
FINA W  35.6 646.9  9.1 24.3 1865.9 
1st DW  23.8 646.9  7.5 24.3 1865.9 
1st DT  83.0 1578.0 3636.0 10188.0 8633.0 
1st FR 449.37 396.19 2.57 2.38 206.80 
DW/DT 287.02 409.98 2.07 2.38 216.13 
FRate 449.37 396.19 2.32 2.38 211.47 
Retry#  02    01      

--------- #1161 11/06/2015 09:49:01 Total: 2645.1 --------- 
RCPE: 101 ID: 204 WKOD: 0 OPRT: 0 TARE: 12.3 
MAT  ADDI(2) REGR(4) ADDI(5) ADDI(6) NATU(8) 
       2%  25% 0.5% 1.3% 100 
FINA R  1.87 24.36 0.52 1.34 100.00 
FINA W  36.1 644.3 10.1 25.9 1928.8 
1st DW  24.8 644.3 10.1 25.9 1928.8 
1st DT  86.0 1578.0 4159.0 10532.0 8454.0 
1st FR 449.37 396.19 2.32 2.38 211.47 
DW/DT 288.18 408.28 2.43 2.46 228.15 
FRate 449.37 396.19 2.32 2.42 219.81 
Retry#  02          

Мне нужно иметь сценарий, предпочтительно PowerShell, разобрать print.txt файл и выводит его на output.csv.

Пример output.csv (заголовки строк, созданные вручную):

Cycle #,Date,Time,Total Cycle Weight,RCPE,WSB ID #,WKOD #,Op #,TARE,MAT: ADDI(2),MAT: REGR(4),MAT: ADDI(5),MAT: ADDI(6),MAT: NATU(8),FINA R: ADDI(2),FINA R: REGR(4),FINA R: ADDI(5),FINA R: ADDI(6),FINA R: NATU(8),FINA W: ADDI(2),FINA W: REGR(4),FINA W: ADDI(5),FINA W: ADDI(6),FINA W: NATU(8),1st DW: ADDI(2),1st DW: REGR(4),1st DW: ADDI(5),1st DW: ADDI(6),1st DW: NATU(8),1st DT: ADDI(2),1st DT: REGR(4),1st DT: ADDI(5),1st DT: ADDI(6),1st DT: NATU(8),1st FR: ADDI(2),1st FR: REGR(4),1st FR: ADDI(5),1st FR: ADDI(6),1st FR: NATU(8),DW/DT: ADDI(2),DW/DT: REGR(4),DW/DT: ADDI(5),DW/DT: ADDI(6),DW/DT: NATU(8),FRate: ADDI(2),FRate: REGR(4),FRate: ADDI(5),FRate: ADDI(6),FRate: NATU(8),Retry#: ADDI(2),Retry#: REGR(4),Retry#: ADDI(5),Retry#: ADDI(6),Retry#: NATU(8) 
1157,2015-11-06,09:44:21,2482.3,101,204,0,0,13.6,2%,25%,0.50%,1.30%,100,1.89,25.36,0.54,1.31,100.00,33.70,629.40,9.60,23.30,1786.10,22.80,629.40,9.60,23.30,1786.10,79.00,1578.00,3622.00,9753.00,8468.00,449.37,396.19,2.47,2.38,212.82,288.40,398.88,2.66,2.39,210.93,449.37,396.19,2.57,2.38,211.87,02,,,, 
1158,2015-11-06,09:45:40,2513.7,101,204,0,0,12.4,2%,25%,0.50%,1.30%,100,1.81,25.48,0.49,1.28,100.00,32.80,640.40,8.80,23.20,1808.40,21.10,640.40,8.80,23.20,1705.80,80.00,1578.00,3524.00,9875.00,8456.00,449.37,396.19,2.57,2.38,211.87,263.20,405.85,2.51,2.35,201.73,449.37,396.19,2.57,2.38,206.80,01,,,,01 
1159,2015-11-06,09:46:43,2484.9,101,204,0,0,12.3,2%,25%,0.50%,1.30%,100,1.83,25.36,0.51,1.26,100.00,32.80,630.20,9.10,22.60,1790.20,24.30,630.20,9.10,22.60,1790.20,80.00,1578.00,3489.00,9775.00,8710.00,449.37,396.19,2.57,2.38,206.80,303.24,399.39,2.60,2.31,205.53,449.37,396.19,2.57,2.38,206.80,01,,,, 
1160,2015-11-06,09:47:58,2581.8,101,204,0,0,12.7,2%,25%,0.50%,1.30%,100,1.91,25.06,0.49,1.30,100.00,35.60,646.90,9.10,24.30,1865.90,23.80,646.90,7.50,24.30,1865.90,83.00,1578.00,3636.00,10188.00,8633.00,449.37,396.19,2.57,2.38,206.80,287.02,409.98,2.07,2.38,216.13,449.37,396.19,2.32,2.38,211.47,02,,01,, 
1161,2015-11-06,09:49:01,2645.1,101,204,0,0,12.3,2%,25%,0.50%,1.30%,100,1.87,24.36,0.52,1.34,100.00,36.10,644.30,10.10,25.90,1928.80,24.80,644.30,10.10,25.90,1928.80,86.00,1578.00,4159.00,10532.00,8454.00,449.37,396.19,2.32,2.38,211.47,288.18,408.28,2.43,2.46,228.15,449.37,396.19,2.32,2.42,219.81,02,,,, 

ли кто-нибудь уход, чтобы принять удар на это? Я прочитал множество подобных запросов здесь, но не имел большой удачи в своей собственной реализации.

+2

Вы найдете очень мало людей, желающих закодировать для вас весь сценарий. Этот сайт, как правило, предпочитает, чтобы помочь решить проблему с одной проблемной областью в существующем скрипте. –

ответ

1

Только начало, но вы видите, где это приводит к :) следующее регулярное выражение соответствует первые две строки (в свободном режиме расстояния, который)

\#(?P<cycle>\d+)\s 
    (?P<date>[\d/]+)\s 
    (?P<time>[\d:]+)\s+ 
    Total:\s(?P<total>[\d.]+)[-\s]+ 
    RCPE:\s+(?P<rcpe>\d+)\s 
    ID:\s(?P<id>\d+)\s 
    WKOD:\s+(?P<wkod>\d+)\s 
    OPRT:\s+(?P<oprt>\d+)\s 
    TARE:\s(?P<tare>[.\d]+) 

После этого, вы просто склеить части. См. a demo on regex101.com. Кроме того, @Bacon Bits, вероятно, прав - вам может быть лучше искать фрилансера.

0

Я бы, вероятно, пошел с регулярным выражением, но вот несколько альтернатив.

Если у вас есть Powershell 5.0, вы можете попробовать ConvertFrom-String с помощью простого в использовании шаблона.

$Template = @' 
--------- #{Cycle*:1157} {Date:11/06/2015} {Time:09:44:21} Total: {TotalCycleWeight:2482.3} --------- 
RCPE: {RCPE:101} ID: {WSBID:204} WKOD: {WKOD:0} OPRT: {Op:0} TARE: {TARE:13.6} 
MAT  ADDI(2) REGR(4) ADDI(5) ADDI(6) NATU(8) 
       {MAT_ADDI2:2%}  {MAT_REGR4:25%} {MAT_ADDI5:0.5%} {MAT_ADDI6:1.3%} {MAT_NATU8:100} 
FINA R  {FINAR_ADDI2:1.89} {FINAR_REGR4:25.36} {FINAR_ADDI5:0.54} {FINAR_ADDI6:1.31} {FINAR_NATU8:100.00} 
FINA W  {FINAW_ADDI2:33.7} {FINAW_REGR4:629.4}  {FINAW_ADDI5:9.6} {FINAW_ADDI6:23.3} {FINAW_NATU8:1786.1} 
1st DW  {DW1st_ADDI2:22.8} {DW1st_REGR4:629.4}  {DW1st_ADDI5:9.6} {DW1st_ADDI6:23.3} {DW1st_NATU8:1786.1} 
1st DT  {DT1st_ADDI2:79.0} {DT1st_REGR4:1578.0} {DT1st_ADDI5:3622.0} {DT1st_ADDI6:9753.0} {DT1st_NATU8:8468.0} 
1st FR {FR1st_ADDI2:449.37} {FR1st_REGR4:396.19} {FR1st_ADDI5:2.47} {FR1st_ADDI6:2.38} {FR1st_NATU8:212.82} 
DW/DT {DWDT_ADDI2:288.40} {DWDT_REGR4:398.88} {DWDT_ADDI5:2.66} {DWDT_ADDI6:2.39} {DWDT_NATU8:210.93} 
FRate {FRate_ADDI2:449.37} {FRate_REGR4:396.19} {FRate_ADDI5:2.57} {FRate_ADDI6:2.38} {FRate_NATU8:211.87} 
Retry#  {Retry_ADDI2:02} {Retry_REG4:0} {Retry_ADDI5:0} {Retry_ADDI6:0} {Retry_NATU8:0}         

--------- #{Cycle*:1145} {Date:11/06/2015} {Time:09:44:21} Total: {TotalCycleWeight:2482.3} --------- 
RCPE: {RCPE:101} ID: {WSBID:204} WKOD: {WKOD:0} OPRT: {Op:0} TARE: {TARE:13.6} 
MAT  ADDI(2) REGR(4) ADDI(5) ADDI(6) NATU(8) 
       {MAT_ADDI2:2%}  {MAT_REGR4:25%} {MAT_ADDI5:0.5%} {MAT_ADDI6:1.3%} {MAT_NATU8:100} 
'@ 

Get-Content .\Test.txt | ConvertFrom-String -TemplateContent $Template 

Однако, у меня была проблема, что делает его работу с Retry -LINE, так как он не имеет значения в каждом поле. Если вам удастся это исправить, тогда это хорошая альтернатива, если вам неудобно писать регулярное выражение.

Вы также можете использовать split и множество жестко заданных значений.

(Get-Content .\Test.txt -Raw) -split '[\n\r]{4}' | % { 
    $data = $_ -split "\n" 

    $Cycle,$Date,$Time,$TotalCycleWeight = @($data[0] -replace '-+\s+|#|Total:' -split '\s+')[0..3] 
    $RCPE,$WSBID,$WKOD,$Op,$TARE = @($data[1] -replace '\w+:\s+' -split '\s+')[0..4] 
    $MAT_ADDI2,$MAT_REGR4,$MAT_ADDI5,$MAT_ADDI6,$MAT_NATU8 = @($data[3] -split '\s+')[1..5] 
    $FINAR_ADDI2,$FINAR_REGR4,$FINAR_ADDI5,$FINAR_ADDI6,$FINAR_NATU8 = @($data[4] -split '\s+')[2..6] 
    $FINAW_ADDI2,$FINAW_REGR4,$FINAW_ADDI5,$FINAW_ADDI6,$FINAW_NATU8 = @($data[5] -split '\s+')[2..6] 
    $1stDW_ADDI2,$1stDW_REGR4,$1stDW_ADDI5,$1stDW_ADDI6,$1stDW_NATU8 = @($data[6] -split '\s+')[2..6] 
    $1stDT_ADDI2,$1stDT_REGR4,$1stDT_ADDI5,$1stDT_ADDI6,$1stDT_NATU8 = @($data[7] -split '\s+')[2..6] 
    $1stFR_ADDI2,$1stFR_REGR4,$1stFR_ADDI5,$1stFR_ADDI6,$1stFR_NATU8 = @($data[8] -split '\s+')[2..6] 
    $DWDT_ADDI2,$DWDT_REGR4,$DWDT_ADDI5,$DWDT_ADDI6,$DWDT_NATU8 = @($data[9] -split '\s+')[2..6] 
    $FRate_ADDI2,$FRate_REGR4,$FRate_ADDI5,$FRate_ADDI6,$FRate_NATU8 = @($data[10] -split '\s+')[1..5] 
    $Retry_ADDI2 = $data[11].Substring(9,5).Trim() | ? { $_ } 
    $Retry_REGR4 = $data[11].Substring(15,9).Trim() | ? { $_ } 
    $Retry_ADDI5 = $data[11].Substring(25,9).Trim() | ? { $_ } 
    $Retry_ADDI6 = $data[11].Substring(35,9).Trim() | ? { $_ } 
    $Retry_NATU8 = $data[11].Substring(45,$data[11].Length-45).Trim() | ? { $_ } 

    New-Object -TypeName psobject -Property @{ 
     'Cycle #' = $Cycle 
     'Date' = $Date 
     'Time' = $Time 
     'Total Cycle Weight' = $TotalCycleWeight 
     'RCPE' = $RCPE 
     'WSB ID #' = $WSBID 
     'WKOD #' = $WKOD 
     'Op #' = $Op 
     'TARE' = $TARE 
     'MAT: ADDI(2)' = $MAT_ADDI2 
     'MAT: REGR(4)' = $MAT_REGR4 
     'MAT: ADDI(5)' = $MAT_ADDI5 
     'MAT: ADDI(6)' = $MAT_ADDI6 
     'MAT: NATU(8)' = $MAT_NATU8 
     'FINA R: ADDI(2)' = $FINAR_ADDI2 
     'FINA R: REGR(4)' = $FINAR_REGR4 
     'FINA R: ADDI(5)' = $FINAR_ADDI5 
     'FINA R: ADDI(6)' = $FINAR_ADDI6 
     'FINA R: NATU(8)' = $FINAR_NATU8 
     'FINA W: ADDI(2)' = $FINAW_ADDI2 
     'FINA W: REGR(4)' = $FINAW_REGR4 
     'FINA W: ADDI(5)' = $FINAW_ADDI5 
     'FINA W: ADDI(6)' = $FINAW_ADDI6 
     'FINA W: NATU(8)' = $FINAW_NATU8 
     '1st DW: ADDI(2)' = $1stDW_ADDI2 
     '1st DW: REGR(4)' = $1stDW_REGR4 
     '1st DW: ADDI(5)' = $1stDW_ADDI5 
     '1st DW: ADDI(6)' = $1stDW_ADDI6 
     '1st DW: NATU(8)' = $1stDW_NATU8 
     '1st DT: ADDI(2)' = $1stDT_ADDI2 
     '1st DT: REGR(4)' = $1stDT_REGR4 
     '1st DT: ADDI(5)' = $1stDT_ADDI5 
     '1st DT: ADDI(6)' = $1stDT_ADDI6 
     '1st DT: NATU(8)' = $1stDT_NATU8 
     '1st FR: ADDI(2)' = $1stFR_ADDI2 
     '1st FR: REGR(4)' = $1stFR_REGR4 
     '1st FR: ADDI(5)' = $1stFR_ADDI5 
     '1st FR: ADDI(6)' = $1stFR_ADDI6 
     '1st FR: NATU(8)' = $1stFR_NATU8 
     'DW/DT: ADDI(2)' = $DWDT_ADDI2 
     'DW/DT: REGR(4)' = $DWDT_REGR4 
     'DW/DT: ADDI(5)' = $DWDT_ADDI5 
     'DW/DT: ADDI(6)' = $DWDT_ADDI6 
     'DW/DT: NATU(8)' = $DWDT_NATU8 
     'FRate: ADDI(2)' = $FRate_ADDI2 
     'FRate: REGR(4)' = $FRate_REGR4 
     'FRate: ADDI(5)' = $FRate_ADDI5 
     'FRate: ADDI(6)' = $FRate_ADDI6 
     'FRate: NATU(8)' = $FRate_NATU8 
     'Retry#: ADDI(2)' = $Retry_ADDI2 
     'Retry#: REGR(4)' = $Retry_REGR4 
     'Retry#: ADDI(5)' = $Retry_ADDI5 
     'Retry#: ADDI(6)' = $Retry_ADDI6 
     'Retry#: NATU(8)' = $Retry_NATU8 
    } 
} | Select-Object 'Cycle #','Date','Time','Total Cycle Weight','RCPE','WSB ID #','WKOD #','Op #','TARE','MAT: ADDI(2)','MAT: REGR(4)','MAT: ADDI(5)','MAT: ADDI(6)','MAT: NATU(8)','FINA R: ADDI(2)','FINA R: REGR(4)','FINA R: ADDI(5)','FINA R: ADDI(6)','FINA R: NATU(8)','FINA W: ADDI(2)','FINA W: REGR(4)','FINA W: ADDI(5)','FINA W: ADDI(6)','FINA W: NATU(8)','1st DW: ADDI(2)','1st DW: REGR(4)','1st DW: ADDI(5)','1st DW: ADDI(6)','1st DW: NATU(8)','1st DT: ADDI(2)','1st DT: REGR(4)','1st DT: ADDI(5)','1st DT: ADDI(6)','1st DT: NATU(8)','1st FR: ADDI(2)','1st FR: REGR(4)','1st FR: ADDI(5)','1st FR: ADDI(6)','1st FR: NATU(8)','DW/DT: ADDI(2)','DW/DT: REGR(4)','DW/DT: ADDI(5)','DW/DT: ADDI(6)','DW/DT: NATU(8)','FRate: ADDI(2)','FRate: REGR(4)','FRate: ADDI(5)','FRate: ADDI(6)','FRate: NATU(8)','Retry#: ADDI(2)','Retry#: REGR(4)','Retry#: ADDI(5)','Retry#: ADDI(6)','Retry#: NATU(8)' | Export-Csv .\Test.csv -NoTypeInformation 
Смежные вопросы