reemplazar - Eliminar comillas y comas de una cadena en MySQL
reemplazar comillas dobles en sql (8)
Aquí hay un buen caso para expresiones regulares. Puede ejecutar un buscar y reemplazar en los datos antes de importar (más fácil) o más adelante si la importación de SQL acepta esos caracteres (no tan fácil). Pero en cualquier caso, tiene varios métodos para buscar y reemplazar, ya sean editores, lenguajes de scripting, programas de GUI, etc. Recuerde que va a querer buscar y reemplazar todos los caracteres incorrectos.
Una expresión regular típica para encontrar la coma y las comillas (asumiendo solo comillas dobles) es: (Lista negra)
/[,"]/
O bien, si encuentra que algo puede 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 ha discutido la gente de arriba es que no conocemos todos los datos en su archivo CSV. Parece que desea eliminar las comas y las comillas de todos los números en el archivo CSV. Pero como no sabemos qué más hay en el archivo CSV, queremos asegurarnos de no dañar otros datos. Hacer un hallazgo / reemplazo a ciegas podría afectar otras partes del archivo.
Estoy importando algunos datos de un archivo CSV
, y los números que son más grandes que 1000
se convierten en 1,100
etc.
¿Cuál es una buena manera de eliminar tanto las comillas como la coma de esto para poder ponerlo en un campo int
?
Editar:
Los datos ya están en una tabla MySQL, así que necesito poder usar SQL. Lo siento por la confusión.
En realidad, nlucaroni, tu caso no está del todo bien. Su ejemplo no incluye comillas dobles, por lo
id,age,name,...
1,23,phil,
no coincidirá con mi expresión regular. Requiere el formato "XXX, XXX". No puedo pensar en un ejemplo de cuándo coincidirá incorrectamente.
Todo el siguiente ejemplo no incluirá el deliminador 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.
¡Aclamaciones!
Esta es la forma de PHP:
$stripped = str_replace(array('','', ''"''), '''', $value);
La respuesta de Daniel y Eldila tiene un problema: eliminan todas las comillas y comas en 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) punto y coma por pestañas.
- Búsqueda: ";"
- Reemplazar: / t
Como sé en qué columna serán mis valores afectados, realizo otra búsqueda y reemplazo:
- Buscar: ^ ([/ t] +) / t ([/ t] +) / t ([0-9] +), ([0-9] +) / t
- Reemplazar: / 1 / t / 2 / t / 3 / 4 / t
... dado el valor con la coma está en la tercera columna.
Debe comenzar con un "^" para asegurarse de que comienza al principio de una línea. Luego, repite ([0-9] +) / t tan a menudo como haya columnas que quiera dejar tal 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 mantener los valores de la línea editada, separándolos con / t (pestaña). Luego colocamos / 3 / 4 (sin tabulación entre) para poner los dos componentes del número sin la coma uno detrás del otro. Todos los valores después de eso se dejarán solos.
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, entonces, si omite las comillas, deberá asegurarse de que los valores del texto no contengan ningún punto y coma. Es por eso que prefiero usar TAB como separador de columna.
Normalmente hago eso en un editor de texto ordinario (EditPlus) que admite RegExp, pero las mismas expresiones regulares se pueden usar en cualquier lenguaje de programación.
La solución a la pregunta cambiada es básicamente la misma.
Deberá ejecutar la consulta de selección con la cláusula regex where.
Algo así como
Select *
FROM SOMETABLE
WHERE SOMEFIELD REGEXP ''"(/d+),(/d+)"''
Para cada una de estas filas, quiere hacer la siguiente sustitución de expresiones regulares s / "(/ d +), (/ d +)" / $ 1 $ 2 / y luego actualice el campo con el nuevo valor.
Por favor, Joseph Pecoraro en serio y tenga una copia de seguridad antes de hacer cambios masivos a cualquier archivo o base de datos. Porque cuando haces regex, puedes estropear seriamente los datos si hay casos que te perdiste.
Puedes usar este comando perl.
Perl -lne ''s/[,|"]//; print'' file.txt > newfile.txt
Puede que necesite jugar un poco con esto, pero debería funcionar.
Mi comando elimina todos '','' y ''"''.
Para convertir el aguijón "1,000" más estrictamente, necesitará el siguiente comando.
Perl -lne ''s/"(/d+),(/d+)"/$1$2/; print'' file.txt > newfile.txt
Supongo que es porque los datos pudieron importar que el campo es en realidad varchar o algún campo de caracteres, porque la importación a un campo numérico podría haber fallado. Aquí estaba un caso de prueba que ejecuté puramente una solución MySQL, SQL.
La tabla es solo una columna (alfa) que es varchar.
mysql> desc t; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | alpha | varchar(15) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
Agrega 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" | +-------------+
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 utilicé fue:
UPDATE table
SET field_name = replace( replace(field_name, '','', ''''), ''"'', '''' );
Miré la documentación de MySQL y no parecía que pudiera hacer las expresiones regulares buscar y reemplazar . Aunque podría, como Eldila , usar una expresión regular para un hallazgo y luego una solución alternativa para reemplazar.
También tenga cuidado con s/"(/d+),(/d+)"/$1$2/
¿Qué pasa si el número tiene más de una coma, por ejemplo "1,000,000" va a querer hacer un reemplazo global (en perl eso es s///g
). Pero incluso con un reemplazo global, el reemplazo comienza donde la dejó por última vez (a menos que perl sea diferente), y se perderá el resto de los otros grupos separados por comas. Una posible solución sería hacer que la primera (/ d +) opcional sea tan s/(/d+)?,(/d+)/$1$2/g
y en este caso necesitaría un segundo hallazgo y reemplazar para quitar las comillas.
Aquí hay algunos ejemplos de Ruby de las expresiones regulares que actúan solo en la cadena "1,000,000", note que NO hay una comilla doble dentro de la cadena, esta 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"