Pregunta

Estoy importando algunos datos de un CSV archivo y números mayores que 1000 convertirse en 1,100 etc.

¿Cuál es una buena manera de eliminar las comillas y la coma de esto para poder ponerlo en un int ¿campo?

Editar:

En realidad, los datos ya están en una tabla MySQL, por lo que necesito poder hacerlo usando SQL.Lo siento por la confusión.

¿Fue útil?

Solución

Este es un buen caso para las expresiones regulares.Puede ejecutar una búsqueda y reemplazo de los datos antes de importarlos (más fácil) o más adelante si la importación de SQL aceptó esos caracteres (no es tan fácil).Pero en cualquier caso, tiene varios métodos para buscar y reemplazar, ya sean editores, lenguajes de secuencias de comandos, programas GUI, etc.Recuerde que querrá buscar y reemplazar todo de los malos personajes.

Una expresión regular típica para encontrar comas y comillas (asumiendo solo comillas dobles) es: (Lista negra)

/[,"]/

O, si encuentra que algo podría cambiar en el futuro, esta expresión regular coincide con cualquier cosa excepto un número o punto decimal. (Lista blanca)

/[^0-9\.]/

Lo que han comentado las personas anteriores es que no conocemos todos los datos de su archivo CSV.Parece que desea eliminar las comas y comillas de todos los números del archivo CSV.Pero como no sabemos qué más hay en el archivo CSV, queremos asegurarnos de no dañar otros datos.Simplemente hacer una búsqueda/reemplazo a ciegas podría afectar otras partes del archivo.

Otros consejos

Supongo que debido a que los datos se pudieron importar, el campo es en realidad un varchar o algún campo de caracteres, porque la importación a un campo numérico podría haber fallado.Aquí hubo un caso de prueba en el que ejecuté puramente una solución MySQL, SQL.

  1. La tabla es solo una columna (alfa) que es un varchar.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Agregar un registro

    mysql> insert into t values('"1,000,000"');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t;
    
    +-------------+
    | alpha       |
    +-------------+
    | "1,000,000" | 
    +-------------+
    
  3. Declaración de actualización.

    mysql> update t set alpha = replace( replace(alpha, ',', ''), '"', '' );
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from t;
    
    +---------+
    | alpha   |
    +---------+
    | 1000000 | 
    +---------+
    

Entonces al final la declaración que usé fue:

UPDATE table
   SET field_name = replace( replace(field_name, ',', ''), '"', '' );

miré el Documentación MySQL y no parecía que pudiera encontrar las expresiones regulares y reemplazar.Aunque podrías, como Eldila, use una expresión regular para buscar y luego una solución alternativa para reemplazar.


También tenga cuidado con s/"(\d+),(\d+)"/$1$2/ Porque, ¿qué pasa si el número tiene más de una sola coma, por ejemplo, "1.000.000?", querrás hacer un reemplazo global (en Perl, es decir s///g).Pero incluso con un reemplazo global, el reemplazo comienza donde lo dejó por última vez (a menos que Perl sea diferente) y omitiría todos los demás grupos separados por comas.Una posible solución sería hacer que el primer (\d+) sea opcional así s/(\d+)?,(\d+)/$1$2/g y en este caso necesitaría una segunda búsqueda y reemplazo para eliminar las comillas.

Aquí hay algunos ejemplos de Ruby de expresiones regulares que actúan solo en la cadena "1,000,000", observe que NO hay comillas dobles dentro de la cadena, esto es solo una cadena del número en sí.

>> "1,000,000".sub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+)?,(\d+)/, '\1\2' )
# => "1000000"  
>> "1,000,000".gsub( /[,"]/, '' )
# => "1000000"  
>> "1,000,000".gsub( /[^0-9]/, '' )
# => "1000000"

Podrías usar este comando de Perl.

Perl -lne 's/[,|"]//; print' file.txt > newfile.txt

Es posible que tengas que jugar un poco con él, pero debería funcionar.

Esta es la forma PHP:

$stripped = str_replace(array(',', '"'), '', $value);

Enlace a la página de W3Schools

En realidad, nlucaroni, tu caso no es del todo correcto.Su ejemplo no incluye comillas dobles, por lo que

id,age,name,...
1,23,phil,

no coincidirá con mi expresión regular.Requiere el formato "XXX,XXX".No se me ocurre ningún ejemplo de cuándo coincidirá incorrectamente.

Todos los ejemplos siguientes no incluirán el delimitador en la expresión regular:

"111,111",234
234,"111,111"
"111,111","111,111"

Por favor, avíseme si puede pensar en un contraejemplo.

¡Salud!

La solución a la pregunta modificada es básicamente la misma.

Tendrá que ejecutar la consulta de selección con la cláusula de expresión regular donde.

algo así como

Select *
  FROM SOMETABLE
  WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'

Para cada una de estas filas, desea realizar la siguiente sustitución de expresiones regulares s/"(\d+),(\d+)"/$1$2/ y luego actualizar el campo con el nuevo valor.

Por favor, Joseph Pecoraro en serio y tenga una copia de seguridad antes de realizar cambios masivos en cualquier archivo o base de datos.Porque cada vez que haces expresiones regulares, puedes estropear seriamente los datos si hay casos que te has pasado por alto.

Mi comando elimina todos los ',' y '"'.

Para convertir el sting "1000" de manera más estricta, necesitará el siguiente comando.

Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt

La respuesta de Daniel y Eldila tiene un problema:Eliminan todas las comillas y comas de todo el archivo.

Lo que suelo hacer cuando tengo que hacer algo como esto es reemplazar primero todas las comillas de separación y (normalmente) los puntos y comas por tabulaciones.

  • Buscar: ";"
  • Reemplazar: \ t

Como sé en qué columna estarán mis valores afectados, hago otra búsqueda y reemplazo:

  • Buscar: ^([ ]+) ([ ]+) ([0-9]+),([0-9]+)
  • Reemplazar: \1 \2 \3\4

...dado el valor con la coma está en la tercera columna.

Debe comenzar con "^" para asegurarse de que comience al principio de una línea.Luego repites ([0-9]+) tantas veces como haya columnas que quieras dejar como están.

([0-9]+),([0-9]+) busca valores donde hay un número, luego una coma y luego otro número.

En la cadena de reemplazo usamos \1 y \2 para simplemente mantener los valores de la línea editada, separándolos con (tabulación).Luego colocamos \3\4 (sin tabulación entre ellos) para colocar los dos componentes del número sin la coma uno después del otro.Todos los valores posteriores a eso se dejarán en paz.

Si necesita que su archivo tenga punto y coma para separar los elementos, puede continuar y reemplazar las pestañas con punto y coma.Sin embargo, si omite las comillas, deberá asegurarse de que los valores del texto no contengan punto y coma.Por eso prefiero usar TAB como separador de columnas.

Normalmente hago esto en un editor de texto común (EditPlus) que admita RegExp, pero las mismas expresiones regulares se pueden usar en cualquier lenguaje de programación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top