Tengo un formulario que permite al usuario cargar un archivo de texto o copiar / pegar el contenido del archivo en un área de texto. Puedo diferenciar fácilmente entre los dos y poner el que ingresaron en una variable de cadena, pero ¿a dónde voy desde allí?
Necesito iterar sobre cada línea de la cadena (preferiblemente no preocuparme por las nuevas líneas en diferentes máquinas), asegurarme de que tenga exactamente un token (sin espacios, tabulaciones, comas, etc.), desinfectar los datos y luego generar una consulta SQL basado en todas las líneas.
Soy un programador bastante bueno, así que conozco la idea general sobre cómo hacerlo, pero hace tanto tiempo que trabajé con PHP que siento que estoy buscando las cosas incorrectas y, por lo tanto, obtengo información inútil. El problema clave que tengo es que quiero leer el contenido de la cadena línea por línea. Si fuera un archivo, sería fácil.
Principalmente busco funciones PHP útiles, no un algoritmo de cómo hacerlo. ¿Alguna sugerencia?
s($myString)->normalizeLineEndings()
está disponible con github.com/delight-im/PHP-Str (biblioteca bajo licencia MIT) que tiene muchos otros ayudantes de cadena útiles. Es posible que desee echar un vistazo al código fuente.Respuestas:
preg_split
la variable que contiene el texto e iterar sobre la matriz devuelta:fuente
/((\r?\n)|(\r\n?))/
./((\r?\n)|(\n?\r))/
Me gustaría proponer una alternativa significativamente más rápida (y eficiente en memoria): en
strtok
lugar depreg_split
.Al probar el rendimiento, iteré 100 veces sobre un archivo de prueba con 17 mil líneas:
preg_split
tomó 27.7 segundos, mientras questrtok
tomó 1.4 segundos.Tenga en cuenta que aunque
$separator
se define como"\r\n"
,strtok
se separará en cualquiera de los caracteres y, a partir de PHP4.1.0, omita las líneas / tokens vacíos.Consulte la entrada manual de strtok: http://php.net/strtok
fuente
prey_split
tampocoexplode
deben usarse para producir fragmentos de cadena estructurados. Es como apuntar a una mosca con una bazuca .strtok()
algo más dentro de esewhile
ciclo romperá las cosas. También lo estaba usando para agarrar todo en una cadena hasta el primer espacio ( stackoverflow.com/a/2477411/1767412 ) y me tomó un minuto darme cuenta de por qué las cosas no iban según lo planeadoSi necesita manejar nuevas líneas en diferentes sistemas, simplemente puede usar la constante PHP_EOL constante de PHP (http://php.net/manual/en/reserved.constants.php) y simplemente usar explotar para evitar la sobrecarga del motor de expresión regular .
fuente
PHP_EOL (string)
es el símbolo correcto 'Fin de línea' para esta plataforma.Es demasiado complicado y feo, pero en mi opinión, este es el camino a seguir:
fuente
php://temp
para almacenar datos más grandes en un archivo de disco temporal.^ así es como se rompen las líneas correctamente , multiplataforma compatible con
Regexp
:)fuente
Posibles problemas de memoria con
strtok
:Dado que una de las soluciones sugeridas usa
strtok
, desafortunadamente no señala un posible problema de memoria (aunque afirma ser eficiente en la memoria). Cuando se usa destrtok
acuerdo con el manual , el:Lo hace cargando el archivo en la memoria. Si está utilizando archivos grandes, debe vaciarlos si ha terminado de recorrer el archivo.
Si solo le preocupan los archivos físicos (por ejemplo, minería de datos):
Según el manual , para la parte de carga de archivos puede usar el
file
comando:fuente
La respuesta de Kyril es mejor teniendo en cuenta que necesita poder manejar nuevas líneas en diferentes máquinas.
Los uso mucho:
fuente