Удаление кавычек и запятых из строки в MySQL

StackOverflow https://stackoverflow.com/questions/7917

  •  08-06-2019
  •  | 
  •  

Вопрос

Я импортирую некоторые данные из CSV файл и числа, превышающие 1000 превратиться в 1,100 и т. д.

Какой хороший способ удалить из этого кавычки и запятую, чтобы я мог поместить это в int поле?

Редактировать:

Данные на самом деле уже находятся в таблице MySQL, поэтому мне нужно иметь возможность сделать это с помощью SQL.Извините за путаницу.

Это было полезно?

Решение

Вот хороший пример регулярных выражений.Вы можете выполнить поиск и замену данных либо перед импортом (проще), либо позже, если импорт SQL принял эти символы (не так просто).Но в любом случае у вас есть любое количество методов поиска и замены, будь то редакторы, языки сценариев, программы с графическим интерфейсом и т. д.Помните, что вам понадобится найти и заменить все из плохих персонажей.

Типичное регулярное выражение для поиска запятой и кавычек (при условии, что это только двойные кавычки): (Черный список)

/[,"]/

Или, если вы обнаружите, что что-то может измениться в будущем, это регулярное выражение соответствует чему угодно, кроме числа или десятичной точки. (Белый список)

/[^0-9\.]/

Вышеупомянутые люди обсуждали то, что мы не знаем всех данных в вашем CSV-файле.Похоже, вы хотите удалить запятые и кавычки из всех чисел в CSV-файле.Но поскольку мы не знаем, что еще находится в файле CSV, мы хотим убедиться, что не повредим другие данные.Простое слепое выполнение поиска/замены может повлиять на другие части файла.

Другие советы

Я предполагаю, что, поскольку данные удалось импортировать, поле на самом деле является varchar или каким-либо символьным полем, поскольку импорт в числовое поле мог завершиться неудачно.Вот тестовый пример, в котором я использовал исключительно решение MySQL и SQL.

  1. Таблица представляет собой всего лишь один столбец (альфа), который является varchar.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Добавить запись

    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. Обновить заявление.

    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 | 
    +---------+
    

Итак, в конце концов я использовал следующее утверждение:

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

Я посмотрел на Документация MySQL и не похоже, что я могу найти регулярные выражения и заменить.Хотя ты мог бы, типа Эльдила, используйте регулярное выражение для поиска, а затем альтернативное решение для замены.


Также будьте осторожны с s/"(\d+),(\d+)"/$1$2/ потому что, если число содержит больше одной запятой, например «1 000 000», вам понадобится выполнить глобальную замену (в Perl это s///g).Но даже при глобальной замене замена начинается с того места, на котором вы остановились в последний раз (если Perl не отличается), и будет пропускать все остальные группы, разделенные запятыми.Возможным решением было бы сделать первый (\d+) необязательным, например: s/(\d+)?,(\d+)/$1$2/g и в этом случае мне понадобится вторая операция поиска и замены, чтобы удалить кавычки.

Вот несколько примеров регулярных выражений Ruby, действующих только на строку «1 000 000», обратите внимание, что внутри строки НЕТ двойных кавычек, это просто строка самого числа.

>> "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"

Вы можете использовать эту команду Perl.

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

Возможно, вам придется немного с этим поиграть, но это должно сработать.

Вот способ PHP:

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

Ссылка на страницу W3Schools

На самом деле, Нлукарони, ваш случай не совсем верен.В вашем примере нет двойных кавычек, поэтому

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

не будет соответствовать моему регулярному выражению.Требуется формат «XXX,XXX».Я не могу придумать пример, когда оно будет совпадать неправильно.

Во всех следующих примерах разделитель в регулярном выражении не будет включаться:

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

Пожалуйста, дайте мне знать, если вы можете придумать контрпример.

Ваше здоровье!

Решение измененного вопроса в основном то же самое.

Вам нужно будет запустить запрос выбора с регулярным выражением, где.

Что-то вроде

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

Для каждой из этих строк вы хотите выполнить следующую замену регулярного выражения s/"(\d+),(\d+)"/$1$2/, а затем обновить поле новым значением.

Пожалуйста, Джозеф Пекораро серьезно и сделайте резервную копию, прежде чем делать массовые изменения в каких-либо файлах или базах данных.Потому что всякий раз, когда вы выполняете регулярное выражение, вы можете серьезно испортить данные, если есть случаи, которые вы пропустили.

Моя команда удаляет все ',' и '''.

Чтобы более строго преобразовать строку «1000», вам понадобится следующая команда.

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

В ответе Дэниела и Эльдилы есть одна проблема:Они удаляют все кавычки и запятые во всем файле.

Обычно, когда мне приходится делать что-то подобное, я сначала заменяю все разделительные кавычки и (обычно) точки с запятой на табуляции.

  • Поиск: ";"
  • Заменять: \ т

Поскольку я знаю, в каком столбце будут затронутые значения, я выполняю еще один поиск и заменяю:

  • Поиск: ^([ ]+) ([ ]+) ([0-9]+),([0-9]+)
  • Заменять: \1\т\2\т\3\4\т

...учитывая, что значение с запятой находится в третьем столбце.

Вам нужно начать с «^», чтобы убедиться, что он начинается в начале строки.Затем вы повторяете ([0-9]+) столько раз, сколько есть столбцы, которые вы просто хотите оставить как есть.

([0-9]+),([0-9]+) ищет значения, в которых есть число, затем запятая, а затем еще одно число.

В строке замены мы используем \1 и \2, чтобы просто сохранить значения из отредактированной строки, разделяя их (табуляция).Затем мы ставим \3\4 (без табуляции между ними), чтобы поставить два компонента числа без запятой сразу друг за другом.Все значения после этого останутся в покое.

Если вам нужно, чтобы в вашем файле была точка с запятой для разделения элементов, вы можете продолжить и заменить табуляции точками с запятой.Однако тогда — если вы опустите кавычки — вам придется убедиться, что текстовые значения сами не содержат точек с запятой.Вот почему я предпочитаю использовать TAB в качестве разделителя столбцов.

Обычно я делаю это в обычном текстовом редакторе (EditPlus), поддерживающем RegExp, но те же регулярные выражения можно использовать в любом языке программирования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top