2011-12-29 10 views
6

Estoy tratando de ayudar a mi padre, me dio una exportación desde una aplicación de programación en su trabajo. Estamos tratando de ver si podemos importarlo en una base de datos mysql para que él/compañeros de trabajo puedan colaborar en línea con él.Analizando un archivo delimitado por un espacio muy agitado

He intentado una serie de métodos diferentes, pero ninguno parece funcionar bien, y esta no es mi área de especialidades.

de exportación se puede ver aquí: http://roikingon.com/export.txt

Cualquier ayuda/consejos sobre cómo hacer para analizar esto sería muy apreciada!

Gracias!

+0

Asesoramiento ... bueno, debe conocer el formato de datos de esa exportación. Además, las direcciones están separadas por espacios, y no hay pestañas entre las columnas, parece que le falta algo de información para analizar automáticamente. – alxx

+2

Mi conjetura: es ancho fijo y los primeros 3 caracteres son el tipo de registro. Cada tipo de registro tiene el mismo formato (eso significa que cada línea con el tipo de registro 4 tiene las mismas dos columnas, el tipo de registro 17.1 tiene solo una columna pero parece comenzar un nuevo "bloque de ruta"). – vstm

+2

forma deficiente por no incluir sus datos en línea. Ahora el enlace está muerto, por lo que es imposible contextualizar su pregunta. O use pastebin et al ... solo diciendo ... – ftrotter

Respuesta

2

He intentado escribir un analizador (algo dinámico) fijo-con-columna. Eche un vistazo: http://codepad.org/oAiKD0e7 (es demasiado largo para SO, pero es principalmente solo "datos").

Lo que he notado

  • Texto Los datos se alinea a la izquierda con el acolchado a la derecha como "hello___" (= _ espacio)
  • datos numéricos está alineado a la derecha con relleno en el "___42" izquierda

Si desea utilizar mi código que hay todavía cosas que hacer:

  • Los tipos de registros 12.x tienen un conteo de columnas variable (después de algunas columnas estáticas), tendrías que implementar otro "controlador"
  • Algunos de mis anchos probablemente sean incorrectos. Creo que hay un sistema (como los números tienen 4 caracteres de largo y un texto de 8 caracteres de largo, con algunas variaciones para casos especiales). Alguien con conocimiento de dominio y más de un archivo de muestra podría descubrir las columnas.
  • Obtener los datos sin procesar es solo el primer paso, debe mapear los datos brutos a un modelo útil y escribir ese modelo en la base de datos.
+0

¡Ja! En realidad estoy haciendo lo mismo. Lo hice un poco diferente aunque. Utilicé un interruptor en lugar de una matriz grande con una función que devuelve una matriz de datos por línea. ¡buenas cosas! – Roi

1

puede usar división con una expresión regular (cero o más espacios).

Voy a intentar y hacerle saber.

No parece haber una estructura con sus datos.

$data = "12.1 0 1144713  751 17 Y 8 517 526 537 542 550 556 561 567          17 "; 

$arr = preg_split("/ +/", $data); 
print_r($arr); 

Array 
(
    [0] => 12.1 
    [1] => 0 
    [2] => 1144713 
    [3] => 751 
    [4] => 17 
    [5] => Y 
    [6] => 8 
    [7] => 517 
    [8] => 526 
    [9] => 537 
    [10] => 542 
    [11] => 550 
    [12] => 556 
    [13] => 561 
    [14] => 567 
    [15] => 17 
    [16] => 
) 

Prueba este preg_split("/ +/", $data); que divide la línea de cero o más espacios, entonces usted tendrá un buen conjunto, que puede procesar. Pero mirando sus datos, no hay estructura, por lo que tendrá que saber qué elemento de la matriz corresponde a qué datos.

Buena suerte.

+0

Oye, esta fue mi primera idea ... Y comencé a implementar, pero luego me di cuenta de que esto se considera "delimitado por columnas", lo que significa que puede haber registros nulos y al hacerlo omitiría el esos registros. Encontré un PDF que explicaba algo de lo que estaba pasando y en él ... incluía una longitud de campo.usando esa longitud de campo, puedo usar substr ($ row, $ column-position, $ field-length) – Roi

+0

como dije buena suerte. es muy difícil analizar este tipo de datos. – DarthVader

1

Ábrelo con Excel y guárdalo como delimitado por comas. Trate los delimitadores consecutivos como uno, o no. A continuación, vuelva a guardarlo con excel como un csv, que estará separado por comas y más fácil de importar a mysql.

EDIT: El tipo que dice usar preg_split en "[+]" le está dando básicamente la misma respuesta que acabo de hacer.

La pregunta es qué hacer después de eso, entonces.

¿Has determinado todavía cuántos "tipos de filas" hay? Una vez que haya determinado eso y haya definido sus características, será mucho más fácil escribir algún código para atravesarlo.

Si lo guarda en csv, puede usar la función PHP fgetcsv y las funciones relacionadas. Para cada fila, debe verificar su tipo y realizar operaciones dependiendo del tipo.

Me di cuenta de que sus filas de datos podrían dividirse en si los datos de la primera columna contienen o no un "." así que aquí hay un ejemplo de cómo puede recorrer el archivo.

tiempo ($ fila = fgetcsv ($ file_handle)) { si (strpos ($ fila [0], '') === false) {// hacer algo } else {// hacer algo más } }

"hacer algo" sería algo así como "CREATE TABLE table_$row[0]" o "INSERT INTO table", etc.

Ok, y aquí hay algo de observación más:

su archivo es r todos como múltiples archivos pegados. Contiene múltiples formatos.Observe que todas las filas que comienzan con "4" a continuación tienen una abreviatura de compañía de 4 letras seguida del nombre completo de la compañía. Uno de ellos es "caco". Si busca "caco", lo encontrará en varias "tablas" dentro del archivo.

También noté "smuwtfa" (días de la semana) salpicado.

Use pistas como esa para determinar la lógica de cómo tratar cada fila.

+1

Si observa detenidamente el archivo, verá que no se trata simplemente de convertirlo en un archivo CSV. La información contenida allí es mucho más compleja que eso. Necesitará/requerirá ingeniería inversa, análisis y luego importación en una cantidad de tablas diferentes. –

+0

Es difícil incluso decir cuál es la estructura de datos. Sería más útil si publicaras un resumen de las estructuras que necesitas decodificar. –

+0

Parece que pude hacer esto usando substr y siguiendo un formato por sección – Roi

2

Con esa estructura de archivos, básicamente necesita una ingeniería inversa con un formato propietario. Sí, está delimitado por espacios, pero el formato no sigue ningún tipo de estándar como CSV, YAML, etc. Es completamente propietario con lo que parece ser un encabezado y una sección separada con encabezados propios.

Creo que su mejor opción es probar y ver si hay algún otro tipo de exportación que se pueda hacer, como Excel o XML, y trabajar desde allí. Si no hay, entonces vea si hay algún tipo de salida html que pueda ser eliminada, pegada en Excel y viendo lo que obtiene.

Debido a todo lo que mencioné anteriormente, será MUY difícil masajear el archivo en su forma actual en algo que se pueda importar con sensatez en una base de datos. (Tenga en cuenta que a partir de la estructura de archivos se necesitarían varias tablas).

Cuestiones relacionadas