Удалить кавычки и запятые из строки в MySQL - PullRequest
15 голосов
/ 11 августа 2008

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

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

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

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

Ответы [ 8 ]

16 голосов
/ 12 августа 2008

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


Также будьте осторожны с 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"
2 голосов
/ 11 августа 2008

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

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

/[,"]/

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

/[^0-9\.]/

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

0 голосов
/ 11 августа 2008

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

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

Что-то вроде

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

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

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

0 голосов
/ 11 августа 2008

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

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

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

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

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

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

Ура! * * 1013

0 голосов
/ 11 августа 2008

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

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

Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt
0 голосов
/ 11 августа 2008

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

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

  • Поиск:";"
  • Заменить: \ 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 (tab). Затем мы помещаем \ 3 \ 4 (без табуляции между ними), чтобы расположить два компонента числа без запятой сразу после друг друга. Все значения после этого останутся одни.

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

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

0 голосов
/ 11 августа 2008

Вот способ PHP:

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

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

0 голосов
/ 11 августа 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...