Сценарии для разделения единственной строки CSV на несколько

Это - информация об экране и дисплей. Когда Вы в рамках X сессий, необходимо найти что-то как :0 в $DISPLAY.

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

$DISPLAY синтаксис подобен хосту и спецификациям порта, которые распространены в сетях. Полностью изложенный в деталях, это смотрит что-то как hostname:display.screen. Например, если бы Вы относились для отображения 2, экран 1 на example.com, то Вы использовали бы синтаксис example.com:2.1.

:0 сокращение от "первого дисплея".

2
16.02.2015, 17:30
6 ответов

через Python3.

#!/usr/bin/python3
import csv
import sys
fil = sys.argv[1]
with open(fil) as f:
    reader = csv.reader(f)
    for i in reader:
        l = []
        for x in i:
            if ';'  in x:
                m = x.split(';')
                l.append(m)
            else:
                l.append(x)

        for j in l[2]:
            print(l[0]+','+l[1]+','+j)

Сохраните вышеуказанный скрипт в файле и назовите его как Script.py . Запустите этот скрипт,

python3 script.py inputfile
2
27.01.2020, 21:56

Если вы хотите что-то быстрое, и знаете, что ваши данные имеют ровно три поля, как показано, то, возможно, что-то вроде

awk -F, -vOFS=, '{split(substr($3,2,length($3)-2),a,";"); for (i in a) print $1,$2,a[i];}' file.csv
2
27.01.2020, 21:56

Еще один Pythonic Форма

#!/usr/bin/env python3

string= 'John,Doe,"Foo1;Bar1;Foo2;Bar2"'
result = [ string.split('"')[0] + x for x in string.split('"')[1].split(";")]
for i in result:
    print(i)

Вывод:

$ ./test.py 
John,Doe,Foo1
John,Doe,Bar1
John,Doe,Foo2
John,Doe,Bar2
1
27.01.2020, 21:56

Вот еще одно решение с использованием Python 2:

#!/usr/bin/env python2
input_string = 'John,Doe,"Foo1;Bar1;Foo2;Bar2"'
input_list = input_string.split('"')
common_input = input_list[0]
changed_input = input_list[1].split(';')
for i in changed_input:
    print common_input + i

Выход:

John,Doe,Foo1
John,Doe,Bar1
John,Doe,Foo2
John,Doe,Bar2
0
27.01.2020, 21:56
#!/usr/bin/perl -n

if(/(.*?,)"(.*?;*?)"(.*)/){ my ($a,$b,$c)=($1,$2,$3) ;
       for( split(/\s*;\s*/,$b )){
          print "$a$_$c\n"
       }
}
0
27.01.2020, 21:56

Вот некоторые sed , которые вы можете использовать для этого:

sed 'H; 1h; g; x; s/^\n//
/^\([^"]*\)"\([^"]*".*\)/!  d
        s//\1/; x; s//\2/; :t
/\n\{0,1\}\([^;,"]*\)[";]\(.*\)/{ H
        s//\2/; x; s//\1/p
        s/\(.*,\).*/\1/; x
        /^[^,"]*,\(.*\)/!bt
};s//\1/;x;s///;G;x;s///;x;D

Я знаю - это выглядит длинным. Но - пока буферы памяти sed не уступают место под давлением - он должен обрабатывать любой текст в ваших полях, учитывая несколько (как я думаю) реалистичных предостережения:

  1. Части в кавычках " не могут содержать экранированные кавычки
  2. Последнее поле должно быть " полем в кавычках и " кавычками должны быть равномерно соединены.
  3. Поля с разделителями ; не могут содержать запятые, кавычки или ; точки с запятой
  4. Должно быть хотя бы одно поле, разделенное запятыми, перед каждым " цитируемая часть.

Вот пример:

sed ... <<\INPUT
John,Doe,"Foo1;Ba

r1;Foo2;Bar2",Jane,Doe,"Foo3;Bar3;Foo4;Bar4",All,Work,And,

No,Play,Makes,Jack,"A Superhero;
A

Very

Dull

Boy"
INPUT

Если ввести ... выше со сценарием sed в верхней части этого ответа вы должны получить следующий результат:

John,Doe,Foo1
John,Doe,Ba

r1
John,Doe,Foo2
John,Doe,Bar2
Jane,Doe,Foo3
Jane,Doe,Bar3
Jane,Doe,Foo4
Jane,Doe,Bar4
All,Work,And,

No,Play,Makes,Jack,A Superhero
All,Work,And,

No,Play,Makes,Jack,
A

Very

Dull

Boy
0
27.01.2020, 21:56

Теги

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