Ich habe ein Formular, mit dem der Benutzer entweder eine Textdatei hochladen oder den Inhalt der Datei in einen Textbereich kopieren / einfügen kann. Ich kann leicht zwischen den beiden unterscheiden und das, was sie eingegeben haben, in eine Zeichenfolgenvariable einfügen, aber wohin gehe ich von dort aus?
Ich muss über jede Zeile der Zeichenfolge iterieren (vorzugsweise keine Gedanken über Zeilenumbrüche auf verschiedenen Computern machen), sicherstellen, dass genau ein Token vorhanden ist (keine Leerzeichen, Tabulatoren, Kommas usw.), die Daten bereinigen und dann eine SQL-Abfrage generieren basierend auf allen Zeilen.
Ich bin ein ziemlich guter Programmierer, daher kenne ich die allgemeine Idee, wie es geht, aber es ist so lange her, dass ich mit PHP gearbeitet habe, dass ich das Gefühl habe, nach den falschen Dingen zu suchen und so nutzlose Informationen zu finden. Das Hauptproblem, das ich habe, ist, dass ich den Inhalt der Zeichenfolge Zeile für Zeile lesen möchte. Wenn es eine Datei wäre, wäre es einfach.
Ich suche hauptsächlich nach nützlichen PHP-Funktionen, nicht nach einem Algorithmus dafür. Irgendwelche Vorschläge?
s($myString)->normalizeLineEndings()
ist mit github.com/delight-im/PHP-Str (Bibliothek unter MIT-Lizenz) verfügbar, die viele andere nützliche String-Helfer enthält. Vielleicht möchten Sie einen Blick auf den Quellcode werfen.Antworten:
preg_split
die Variable, die den Text enthält, und iterieren über das zurückgegebene Array:quelle
/((\r?\n)|(\r\n?))/
./((\r?\n)|(\n?\r))/
Ich möchte eine deutlich schnellere (und speichereffiziente) Alternative vorschlagen :
strtok
anstattpreg_split
.Beim Testen der Leistung habe ich 100 Mal eine Testdatei mit 17.000 Zeilen durchlaufen:
preg_split
27,7 Sekunden,strtok
1,4 Sekunden.Beachten Sie, dass, obwohl das
$separator
als definiert ist"\r\n"
,strtok
bei beiden Zeichen getrennt wird - und ab PHP4.1.0 leere Zeilen / Token überspringen.Siehe den strtok-Handbucheintrag: http://php.net/strtok
quelle
prey_split
nochexplode
sollte verwendet werden, um strukturierte String-Fragmente zu erhalten. Es ist , als würde man mit einer Panzerfaust auf eine Fliege zielen .strtok()
etwas anderes in dieserwhile
Schleife verwenden, werden die Dinge kaputt gehen. Ich benutzte es auch, um alles in einer Schnur bis zum ersten Leerzeichen zu packen ( stackoverflow.com/a/2477411/1767412 ) und brauchte eine Minute, um zu erkennen, warum die Dinge nicht wie geplantWenn Sie Zeilenumbrüche in verschiedenen Systemen verarbeiten müssen, können Sie einfach die vordefinierte PHP-Konstante PHP_EOL (http://php.net/manual/en/reserved.constants.php) verwenden und einfach explode verwenden, um den Overhead der Engine für reguläre Ausdrücke zu vermeiden .
quelle
PHP_EOL (string)
ist die richtige ‚End Of Line‘ Symbol für diese Plattform.Es ist zu kompliziert und hässlich, aber meiner Meinung nach ist dies der richtige Weg:
quelle
php://temp
größere Daten in einer temporären Festplattendatei speichern.^ So brechen Sie Linien richtig , plattformübergreifend kompatibel mit
Regexp
:)quelle
Mögliche Speicherprobleme mit
strtok
:Da eine der vorgeschlagenen Lösungen verwendet wird,
strtok
weist sie leider nicht auf ein potenzielles Speicherproblem hin (obwohl sie behauptet, speichereffizient zu sein). Bei Verwendungstrtok
gemäß dem Handbuch gilt Folgendes :Dazu wird die Datei in den Speicher geladen. Wenn Sie große Dateien verwenden, müssen Sie diese leeren, wenn Sie die Datei durchlaufen haben.
Wenn Sie sich nur mit physischen Dateien befassen (z. B. Datenerfassung):
Laut Handbuch können Sie für den Teil zum Hochladen von Dateien den folgenden
file
Befehl verwenden:quelle
Die Antwort von Kyril ist am besten, wenn man bedenkt, dass man in der Lage sein muss, Zeilenumbrüche auf verschiedenen Maschinen zu verarbeiten.
Ich benutze diese oft:
quelle