Извлечь часть текстового файла - PullRequest
0 голосов
/ 12 мая 2018

У меня очень большой текстовый файл, и я хотел бы извлечь конкретные столбцы текстового файла, которые предпочтительно начинаются с определенного шаблона, в файл xls. Данные, которые я хотел бы извлечь, начинаются с номера идентификатора дорожки (т.е. идентификатор дорожки = 20). Я хотел бы иметь возможность прочитать номер идентификатора дорожки, а затем сохранить некоторую информацию, приведенную ниже, и затем повторить ее для следующего идентификатора дорожки и т. Д. Я искал в Интернете и решил, что это возможно с помощью PowerShell в Windows.

Под изображением находится небольшая часть текста. В этом случае я хочу сохранить идентификационный номер, равный 13, а также столбцы Z (мм) и KinE (МэВ).

* G4Track Information:   Particle = proton,   Track ID = 13,   Parent ID = 0
*********************************************************************************************************

Step#    X(mm)    Y(mm)    Z(mm) KinE(MeV)  dE(MeV) StepLeng TrackLeng  NextVolume ProcName
    0        0        0 1.08e+03      100         0        0         0       World initStep
    1        0        0      800      100     3e-23      280       280     Tracker Transportation
    2        0        0      450      100  3.75e-23      350       630        Film StepLimiter    
    3        0        0      438     87.1      12.9       12       642        Film hIoni  
    4   -0.204   -0.136      429     76.7      10.4     9.42       651        Film hIoni
    5   -0.422   -0.104      421     67.3      9.43     7.53       659        Film hIoni
    6   -0.679  -0.0754      415     59.3      7.94     5.98       665        Film hIoni
    7   -0.899   -0.128      410     52.3      7.05     4.81       670        Film hIoni
    8    -1.01   -0.141      406     45.7       6.6     3.86       674        Film hIoni
    9    -1.04   -0.168      403     40.3      5.39     3.06       677        Film hIoni
   10     -1.1   -0.203      401     35.3      4.96     2.47       679        Film hIoni
   11    -1.13   -0.218      399     30.6      4.65     1.98       681        Film hIoni
   12    -1.16   -0.191      397     26.6      4.03     1.57       683        Film hIoni
   13    -1.21   -0.154      396     23.2       3.4     1.25       684        Film hIoni
   14    -1.26   -0.141      395       20      3.21     1.01       685        Film hIoni
   15     -1.3   -0.129      394     17.1       2.9    0.812       686        Film hIoni
   16    -1.34   -0.115      394     14.4      2.74    0.651       686        Film hIoni
   17    -1.31   -0.108      393     12.1      2.32    0.517       687        Film hIoni
   18    -1.29    -0.12      393     9.74      2.32    0.418       687        Film hIoni
   19    -1.28    -0.13      392     7.56      2.18    0.332       688        Film hIoni
   20    -1.27   -0.142      392     5.41      2.15    0.261       688        Film hIoni
   21    -1.27   -0.152      392     3.07      2.34    0.199       688        Film hIoni
   22    -1.28   -0.156      392    0.285      2.78    0.118       688        Film hIoni
   23    -1.28   -0.157      392        0     0.285  0.00319       688        Film hIoni

*********************************************************************************************************

part of the txt file

$log = Get-Content C:\Users\kpapa\Desktop\kkk.txt
foreach ($line in $log) { 
    if ($line -like "*878*") { 
        $line | Out-File -FilePath "C:\Users\kpapa\Desktop\kkkk.xls" -Append
    }
}

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Это собирает необходимые данные (идентификатор дорожки, Z (мм), KinE (МэВ)) и помещает их в новый лист Excel:

$filePath = 'C:\Users\kpapa\Desktop\kkk.txt'

$excelArray = New-Object 'object[,]' 1048576, 3     # 1048576 = maximum Excel rows
$row = 0                                            # row counter

foreach($line in [System.IO.File]::ReadLines($filePath) ) {

    # Track-Line => Get Track ID
    if($line -like '*Track ID*') {
       $trackID = ($line -split ',' | ? { $_ -like '*Track ID*' }).ToString() -replace '[^0-9]',''
    }
    else {
        # Value row? => Get Z(mm) and KinE(MeV)
        $tmpArray = $line -split ' ' | ? { $_ }
        if( $tmpArray.Length -gt 5 -and ( $tmpArray[0] -replace '[^0-9]' ).Length -gt 0 ) {
            $excelArray[$row,0] = $trackID
            $excelArray[$row,1] = [decimal]$tmpArray[3]   # Z(mm)
            $excelArray[$row,2] = [decimal]$tmpArray[4]   #KinE(MeV)
            $row++
        }
    }
}

# Put data to Excel...
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Add()
$workbook.WorkSheets.Item(1).Range('A1:C' + $row.ToString() ).Value2 = $excelArray
0 голосов
/ 01 июня 2018

Если выровнять NextVolume по левому краю, вы можете использовать командлет ConvertFrom-SourceTable :

$Particle = ConvertFrom-SourceTable '
Step#    X(mm)    Y(mm)    Z(mm) KinE(MeV)  dE(MeV) StepLeng TrackLeng  NextVolume ProcName
    0        0        0 1.08e+03      100         0        0         0  World      initStep
    1        0        0      800      100     3e-23      280       280  Tracker    Transportation
    2        0        0      450      100  3.75e-23      350       630  Film       StepLimiter    
    3        0        0      438     87.1      12.9       12       642  Film       hIoni  
    4   -0.204   -0.136      429     76.7      10.4     9.42       651  Film       hIoni
    5   -0.422   -0.104      421     67.3      9.43     7.53       659  Film       hIoni
    6   -0.679  -0.0754      415     59.3      7.94     5.98       665  Film       hIoni
    7   -0.899   -0.128      410     52.3      7.05     4.81       670  Film       hIoni
    8    -1.01   -0.141      406     45.7       6.6     3.86       674  Film       hIoni
    9    -1.04   -0.168      403     40.3      5.39     3.06       677  Film       hIoni
   10     -1.1   -0.203      401     35.3      4.96     2.47       679  Film       hIoni
   11    -1.13   -0.218      399     30.6      4.65     1.98       681  Film       hIoni
   12    -1.16   -0.191      397     26.6      4.03     1.57       683  Film       hIoni
   13    -1.21   -0.154      396     23.2       3.4     1.25       684  Film       hIoni
   14    -1.26   -0.141      395       20      3.21     1.01       685  Film       hIoni
   15     -1.3   -0.129      394     17.1       2.9    0.812       686  Film       hIoni
   16    -1.34   -0.115      394     14.4      2.74    0.651       686  Film       hIoni
   17    -1.31   -0.108      393     12.1      2.32    0.517       687  Film       hIoni
   18    -1.29    -0.12      393     9.74      2.32    0.418       687  Film       hIoni
   19    -1.28    -0.13      392     7.56      2.18    0.332       688  Film       hIoni
   20    -1.27   -0.142      392     5.41      2.15    0.261       688  Film       hIoni
   21    -1.27   -0.152      392     3.07      2.34    0.199       688  Film       hIoni
   22    -1.28   -0.156      392    0.285      2.78    0.118       688  Film       hIoni
   23    -1.28   -0.157      392        0     0.285  0.00319       688  Film       hIoni
'

PS C:\> $Particle | Where {$_.'Step#' -eq 20}

ProcName   : hIoni
Z(mm)      : 392
StepLeng   : 0.261
X(mm)      : -1.27
Y(mm)      : -0.142
dE(MeV)    : 2.15
KinE(MeV)  : 5.41
Step#      : 20
NextVolume : Film
TrackLeng  : 688

Это работает для данного примера, но я рекомендую размещать разделители под заголовками, поскольку может быть невозможно определить выравнивание столбцов, если все поля имеют одинаковую ширину с заголовком столбца, например ::100100

 X(mm)
------
 -0.12
 -0.23

Подробнее см .: ConvertFrom-SourceTable -?

Командлет ConvertFrom-SourceTable доступен для загрузки в галерее PowerShell, а исходный код - из хранилища GitHub iRon7/ConvertFrom-SourceTable.

0 голосов
/ 13 мая 2018

Попробуйте что-то вроде этого:

$content=Get-Content "C:\temp\kkk.txt"

#extract rows splited on space delimiter
$rows= $content | where {$_ -notmatch "[*]."} | select -skip 2 | %{

 $row=$_ -split ' ' | where {$_.trim() -ne ''} | %{$_.trim()}

if($row -ne $null)
{
  [pscustomobject]@{
                    Step=$row[0]
                    X=$row[1]
                    Y=$row[2]
                    Z=$row[3]
                    KinE=$row[4]
                    dE=$row[5]
                    StepLeng=$row[6]
                    TrackLeng=$row[7]
                    NextVolume=$row[8]
                    ProcName=$row[9]
                   }

}

}

#extract number searched
$Number= $content | where {$_ -like "* G4Track*"} | %{ $_ -split ',' | where {$_ -like '*Track ID = *'} | %{ ($_ -split '=')[1].Trim()}}

#extract row searched into new file csv (you can open with excel)
$rows | where Step -EQ $Number | export-csv "c:\temp\result.csv" -NoTypeInformation 
...