Удалить кавычки вокруг целых чисел в файле csv

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

Для установки:

sudo apt-get install emerald

] И активировать:

emerald --replace

Вы также можете установить значок fusion, который позволит вам управлять вашими оконными менеджерами и украшениями щелчком.

Чтобы установить: [!d4 ]

sudo apt-get install fusion-icon

И активировать:

fusion-icon

Или найти его в меню в разделе «Системные инструменты».

BTW: есть темы, которые делают оформление окон как Windows, все версии.

1
задан 12 March 2015 в 23:44

3 ответа

Регулярное выражение GNU sed, которое должно работать для этого случая, это

sed -r 's/"([0-9]+)"/\1/g'    

Для чистого sed вам нужно избежать скобок группировки и модификатора +

sed 's/"\([0-9]\+\)"/\1/g'

Вы может выполнять замещение на месте с некоторыми версиями sed eg

sed -ri 's/"([0-9]+)"/\1/g' file.csv

Вы также можете использовать класс POSIX [[:digit:]] вместо диапазона символов [0-9]

6
ответ дан 24 May 2018 в 09:41

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

sed
sed -r 's/^"([^"]+)"(\s*,\s*[^,]+)\s*,\s*"([^"]+)"/\1\2, \3/' file.csv
Объяснение -r позволяет использовать расширенные регулярные выражения, позволяя нам использовать круглые скобки для захвата шаблонов, не требуя их устранения. Итак, мы сопоставляем цитату в начале строки (^"), за которой следует один или несколько символов без кавычек ([^"]+), затем закрывающая цитата, за которой следует 0 или более пробелов, запятая, затем 0 или больше пробелов (\s*,\s*), затем участок не запятых до следующей запятой (это определяет второе поле). Наконец, мы ищем 0 или более пробелов, запятую и заменяем это на 1-й захваченный шаблон (\1), затем 2-й (\2), запятую, пробел и третью. Perl
perl -pe 's/^"([^"]+)"(\s*,\s*[^,]+)\s*,\s*"([^"]+)"/$1$2, $3/; ' file.csv
Объяснение -p означает печать каждой строки после применения скрипта, переданного в -e. Сам скрипт является в основном тем же самым регулярным выражением, что и в sed выше. Только здесь захваченные паттерны $1. awk
awk -F, -v OFS="," '{gsub("\"","",$1)0gsub("\"","",$3);}1;' file.csv 
Объяснение -F устанавливает разделитель полей в ,. OFS - разделитель выходного поля, который также установлен на ,, чтобы линии печатались правильно. [F20] делает замену, заменяя все " ничем, поскольку мы запускаем ее на 1-м ($1) и 3-м полях ($3), она удаляет только кавычки из этих полей. [F24] - это всего лишь awk стенограмма «print the line».
5
ответ дан 24 May 2018 в 09:41
  • 1
    @AvinashRaj спасибо, ответ отредактирован. – terdon♦ 8 April 2014 в 21:06
  • 2
    Я хотел обрезать целые числа. – Balázs Mária Németh 8 April 2014 в 21:09
  • 3
    @ BalázsMáriaNémeth это позволит обрезать цитаты из 1-го и 3-го полей. Он работает независимо от того, что у вас есть в этих полях, целых или любых других. – terdon♦ 8 April 2014 в 21:10
  • 4
    Хорошо, спасибо за ваши усилия. По крайней мере, я знаю, как очищать столбцы в определенных позициях, но на самом деле мне понадобилось, что regexp / capture thing на целых числах. – Balázs Mária Németh 8 April 2014 в 21:11
  • 5
    @ BalázsMáriaNémeth в этом случае использует принятый ответ, но осторожно, \d не только соответствует целым числам, он также будет соответствовать номерам, таким как 0.5, и в зависимости от ваших настроек локали более неясных вещей. – terdon♦ 8 April 2014 в 21:13

Решение python

Маленький сценарий ниже содержит аргумент командной строки файла, выполняет итерацию по каждой строке в этом файле и разбивает каждую строку на список элементов, используя , в качестве разделителя. Каждая запись затем не сортируется и проверяется на то, что она является числовой строкой;

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as fp:
    for line in fp:
        new_vals = []
        vals = line.strip().split(',')
        for val in vals:
            val = val.strip().rstrip().replace('"','')
            if not val.isdigit(): 
               val = '"' + val  + '"'
            new_vals.append(val)
        print(",".join(new_vals))

Тестирование:

$ cat input.txt
"34432", "name", "0", "very long description" 
"1234", "othe name" , "42", "another description"
$ ./unquote_integers.py  input.txt                                       
34432,"name",0,"very long description"
1234,"othe name",42,"another description"

Дополнительные примечания:

В комментариях было задано следующее: , почему сценарий удаляет двойные кавычки вокруг каждого элемента, прежде чем оценивать, является ли элемент числовой строкой или нет. Основная причина этого заключается в том, что включение двойных кавычек сделает такой элемент, как "123", оценкой False, то есть не числовым. Фактически, нам нужно как-то оценить, что находится внутри двойных кавычек. Теперь есть альтернативный способ приблизиться к этому, используя кусочек списка каждого значения. Однако это не лучше, чем использование .replace() с самого начала. Это делает код короче, но по крайней мере в этом случае краткость скрипта не имеет значения - наша цель - заставить код работать, а не код-гольф.

Вот альтернативное решение со списками: [ ! d6]

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as fp:
    for line in fp:
        new_vals = []
        vals = line.strip().split(',')
        for val in vals:
            val = val.strip().rstrip() #remove extra spaces
            val = val.replace('"','') if val[1:-1].isdigit() else val
            new_vals.append(val)
        print(",".join(new_vals))
1
ответ дан 24 May 2018 в 09:41
  • 1
    Я не понимаю, где вы заменяете кавычки и для цифр, вы возвращаете их. Почему бы просто не заменить цифру и оставить в покое остальных? Итак, val = val.strip().rstrip().replace('"','') if val.isdigit() else val. Но я не знаю, является ли это допустимым выражением в python. – Balázs Mária Németh 26 February 2017 в 22:32
  • 2
    @ BalázsMáriaNémeth Проблема - это двойные кавычки. Поскольку строка содержит кавычки, она будет считаться нечисловой. Чтобы определить, является ли строка цифрой, мне нужно как-то избавиться от кавычек. И вы можете видеть это с помощью простого теста: python -c 'print("\"123\"".isdigit())' . Это напечатает False. Теперь, действительно, есть способ сократить это, используя секцию списка. В python строка может считаться списком символов, и ваше выражение может использоваться при оценке val[1:-1]. Однако, короткость здесь не имеет значения. Мы хотим, чтобы код работал, и все. – Sergiy Kolodyazhnyy 26 February 2017 в 22:57
  • 3
    @ BalázsMáriaNémeth и да, это допустимое выражение python – Sergiy Kolodyazhnyy 26 February 2017 в 23:05
  • 4
    спасибо @Serg, ты абсолютно прав, это только показалось странным при первом взгляде :) – Balázs Mária Németh 27 February 2017 в 00:47

Другие вопросы по тегам:

Похожие вопросы: