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

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

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

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

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

Ответов (8)

Решение

Вот хороший случай для регулярных выражений. Вы можете выполнить поиск и замену данных либо перед импортом (проще), либо позже, если импорт 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 и в этом случае мне понадобится второй поиск и замена, чтобы удалить кавычки.

Вот несколько примеров регулярных выражений, действующих только на строку «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"

Вот способ PHP:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что-то вроде

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

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

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

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

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

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

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

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

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

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

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

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

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