2017-07-12 7 views
-1

Ich habe einige Probleme bei der Analyse von Nur-Text-Ausgabe von samtools stats.Aufteilen Zeichenfolge in Schlüsselwert mit Regex

Beispiel Ausgabe:

45205768 + 0 in total (QC-passed reads + QC-failed reads) 
0 + 0 secondary 
0 + 0 supplementary 
5203838 + 0 duplicates 
44647359 + 0 mapped (98.76% : N/A) 
0 + 0 paired in sequencing 
0 + 0 read1 
0 + 0 read2 
0 + 0 properly paired (N/A : N/A) 
0 + 0 with itself and mate mapped 
0 + 0 singletons (N/A : N/A) 
0 + 0 with mate mapped to a different chr 
0 + 0 with mate mapped to a different chr (mapQ>=5) 

Ich mag die Datei Zeile-für-Zeile analysieren und die folgende Ausgabe in einem PHP-Array wie folgt erhalten:

Array(
"in total" => [45205768,0], 
... 
) 

So Geschichte lange Kurz, ich möchte die numerischen Werte von der Vorderseite der Zeile als ein Array von Ganzzahlen und die folgende Zeichenfolge (ohne die Klammern) als Schlüssel erhalten.

+0

Was hast du schon probiert? – Bernhard

+0

viel Müll, der aus irgendeinem Grund nichts getan hat. Sogar die Funktion str_split() in PHP scheint nicht zu funktionieren. –

+0

Die Funktion funktioniert, vertrau mir :) Es ist deine Syntax, die nicht funktioniert. Zeigen Sie einige Ihrer Syntax. Wenn ich regex, versuche ich es immer Schritt für Schritt. – Bernhard

Antwort

1
^(\d+)\s\+\s(\d+)\s([a-zA-Z0-9 ]+).*$ 

Diese Regex ersten Wert gesetzt, der zweite Wert und die folgende Zeichenfolge ohne die Klammern in den Match-Gruppen 1, 2 und 3 jeweils.

Regex101 demo

+0

@MatthiasDeSmet Gern geschehen :) * und Entschuldigung für das nachfolgende Leerzeichen * – BrightOne

0

Dies kann mit nur zwei Capture-Gruppen und dem fullstring Spiel gelöst werden.

Mein Muster genau extrahiert die gewünschten Teilstrings und trimmt die Leerzeichen am Ende von den zu-deklarierten "Schlüssel": Pattern Demo

^(\d+) \+ (\d+) \K[a-z\d ]+(?=\s) #244steps 

PHP-Code: (Demo)

$txt='45205768 + 0 in total (QC-passed reads + QC-failed reads) 
0 + 0 secondary 
0 + 0 supplementary 
5203838 + 0 duplicates 
44647359 + 0 mapped (98.76% : N/A) 
0 + 0 paired in sequencing 
0 + 0 read1 
0 + 0 read2 
0 + 0 properly paired (N/A : N/A) 
0 + 0 with itself and mate mapped 
0 + 0 singletons (N/A : N/A) 
0 + 0 with mate mapped to a different chr 
0 + 0 with mate mapped to a different chr (mapQ>=5)'; 

preg_match_all('/^(\d+) \+ (\d+) \K[a-z\d ]+(?=\s)/m',$txt,$out); 
foreach($out[0] as $k=>$v){ 
    $result[$v]=[(int)$out[1][$k],(int)$out[2][$k]]; // re-casting strings as integers 
} 
var_export($result); 

Ausgang:

array (
    'in total' => array (0 => 45205768, 1 => 0), 
    'secondary' => array (0 => 0, 1 => 0), 
    'supplementary' => array (0 => 0, 1 => 0), 
    'duplicates' => array (0 => 5203838, 1 => 0), 
    'mapped' => array (0 => 44647359, 1 => 0), 
    'paired in sequencing' => array (0 => 0, 1 => 0), 
    'read1' => array (0 => 0, 1 => 0), 
    'read2' => array (0 => 0, 1 => 0), 
    'properly paired' => array (0 => 0, 1 => 0), 
    'with itself and mate mapped' => array (0 => 0, 1 => 0), 
    'singletons' => array (0 => 0, 1 => 0), 
    'with mate mapped to a different chr' => array (0 => 0, 1 => 0) 
) 

Beachten Sie, dass die letzten zwei Zeilen des Eingabetextes einen doppelten Schlüssel im Array $result generieren, was bedeutet, dass die Daten der früheren Zeile durch die Daten der späteren Zeile überschrieben werden. Wenn dies ein Problem darstellt, können Sie Ihre Eingabedaten neu strukturieren oder den Klammerteil als Teil des Schlüssels für die Eindeutigkeit behalten.

Verwandte Themen