J'ai un formulaire qui permet à l'utilisateur de télécharger un fichier texte ou de copier / coller le contenu du fichier dans une zone de texte. Je peux facilement faire la différence entre les deux et mettre celui qu'ils ont entré dans une variable de chaîne, mais où dois-je aller à partir de là?
Je dois parcourir chaque ligne de la chaîne (de préférence sans me soucier des retours à la ligne sur différentes machines), m'assurer qu'il contient exactement un jeton (pas d'espaces, tabulations, virgules, etc.), nettoyer les données, puis générer une requête SQL basé sur toutes les lignes.
Je suis un assez bon programmeur, donc je connais l'idée générale sur la façon de le faire, mais cela fait si longtemps que je n'ai pas travaillé avec PHP que j'ai l'impression de chercher les mauvaises choses et donc de trouver des informations inutiles. Le problème principal que j'ai est que je veux lire le contenu de la chaîne ligne par ligne. Si c'était un fichier, ce serait facile.
Je recherche principalement des fonctions PHP utiles, pas un algorithme pour savoir comment le faire. Aucune suggestion?
s($myString)->normalizeLineEndings()
est disponible avec github.com/delight-im/PHP-Str (bibliothèque sous licence MIT) qui a beaucoup d'autres aides de chaîne utiles. Vous voudrez peut-être jeter un œil au code source.Réponses:
preg_split
la variable contenant le texte, et itérer sur le tableau retourné:la source
/((\r?\n)|(\r\n?))/
./((\r?\n)|(\n?\r))/
Je voudrais proposer une alternative beaucoup plus rapide (et efficace en mémoire):
strtok
plutôt quepreg_split
.Tester les performances, j'ai itéré 100 fois sur un fichier de test de 17 mille lignes: cela a
preg_split
pris 27,7 secondes, alors que cela astrtok
pris 1,4 seconde.Notez que bien que le
$separator
soit défini comme"\r\n"
,strtok
se séparera sur l'un ou l'autre des caractères - et à partir de PHP4.1.0, sautez les lignes / jetons vides.Voir l'entrée du manuel strtok: http://php.net/strtok
la source
prey_split
niexplode
ne doivent être utilisés pour produire des fragments de chaîne structurés. C'est comme viser une mouche avec un bazooka .strtok()
quelque chose d'autre dans cettewhile
boucle cassera les choses. Je l'utilisais également pour tout saisir dans une chaîne jusqu'au premier espace ( stackoverflow.com/a/2477411/1767412 ) et m'a pris une minute pour comprendre pourquoi les choses n'allaient pas comme prévuSi vous avez besoin de gérer les nouvelles lignes dans différents systèmes, vous pouvez simplement utiliser la constante PHP prédéfinie PHP_EOL (http://php.net/manual/en/reserved.constants.php) et simplement utiliser exploser pour éviter la surcharge du moteur d'expression régulière .
la source
PHP_EOL (string)
c'est le bon symbole 'End Of Line' pour cette plate - forme.C'est trop compliqué et moche, mais à mon avis, c'est la voie à suivre:
la source
php://temp
pour stocker des données plus volumineuses dans un fichier de disque temporaire.^ c'est ainsi que vous coupez correctement les lignes , compatible multiplateforme avec
Regexp
:)la source
Problèmes de mémoire potentiels avec
strtok
:Étant donné que l'une des solutions suggérées est utilisée
strtok
, elle ne signale malheureusement pas un problème de mémoire potentiel (même si elle prétend être efficace en mémoire). Lors de l'utilisationstrtok
conformément au manuel , le:Il le fait en chargeant le fichier en mémoire. Si vous utilisez des fichiers volumineux, vous devez les vider si vous avez terminé de parcourir le fichier.
Si vous n'êtes concerné que par les fichiers physiques (par exemple, le datamining):
Selon le manuel , pour la partie téléchargement de fichier, vous pouvez utiliser la
file
commande:la source
La réponse de Kyril est la meilleure étant donné que vous devez être capable de gérer les nouvelles lignes sur différentes machines.
Je les utilise beaucoup:
la source