Perl & [RegEx] Backreferenz direkt via RegEx bearbeiten

rumbalotte

Lieutenant
Registriert
Okt. 2010
Beiträge
671
Hi,

ich habe eine CSV, welche ich verarbeiten möchte (muss :D)
Problem bei dieser: es gibt Datensätze, in denen einer oder mehrere Umbrüche sind (betroffene Zellen sind zum Glück mit " als Texttrenner):
Code:
asd;fdas;qwe;asdf;"bla
blubb
foo
bar
";sdgf;asdf;asdf

Somit kann ich die Datei nicht wirklich Zeilenweise verarbeiten.
Wenn ich die Datei als kompletten String einlese und dann loslege, kann mit diesem Code die Zeilenumbrüche zwischen "" entfernen:

Code:
$input =~ s/;"(.*?)";/;"@{[dropnl($1)]}";/gs;

sub dropnl{
	my $stuff = shift;
	$stuff =~ s/\n//g;
	return $stuff;
}

Nun die aufregende Frage: ist das direkt via RegEx möglich, also ohne die sub "dropnl" aufzurufen?
Code:
$input =~ s/;"(.*?)";/;"<$1 ohne Umbrüche>";/gs;

Danke für alle Inspirationen!

Die Lotte
 
würde es nicht sinn machen erst alle linebreaks zu entfernen und danach den string zu parsen?

schau mal letzten post von hier.
 
Zuletzt bearbeitet:
aber dann wüßte ich nicht mehr, wo ein Datensatz aufhört; was ja bei einer CSV in der Regel (so auch bei dieser) durch einen Umbruch gekennzeichnet wird...
 
Versuch mal
Code:
$text =~ s/\n(?=[^"]*"(;|\n))//gs
(Erklärung: http://www.perlmonks.org/?node_id=518444)

Das deckt natürlich nicht alle Möglichkeiten ab ("\"text\""), aber vielleicht reicht's dir ja. Wenn es ganz ordentlich sein soll, nimm einen CSV-Parser, sollte es ja in Perl zu genüge geben. Du kannst dir auch Perls Grammatiken näher anschauen.
 
Zurück
Oben