Многоуровневый синтаксический анализ данных в формате CSV - PullRequest
0 голосов
/ 11 марта 2020

Привет У меня есть данные CSV в следующем формате

ColumnHeader1,ColumnHeader2,ColumnHeader3
valcol1p1,name=testapp1 environment=dev coldata=My_Test_Logs @$ 192.168.1.1 @$ r1 @$ r2 @$ POST API ,valcol3p1
valcol1p1,name=testapp2 environment=qa coldata=My_Test_Logs @$ 192.168.1.1 @$ r1 @$ r2 @$ GET API ,valcol3p1 

img sample data I

Мне нужно извлечь данные в столбце ColumnHeader2 после My_Test_Logs и разобрать данные после разделителя'@$'.So для каждой строки CSV я бы получил 4 значения. Мне нужно объединить их с тем же значением разделителя '@ $' и поместить в CSV.

Вывод будет выглядеть примерно так:

Output

Теперь я решил это по частям.

Как получить данные столбца ColumnHeader2

awk -F "\"*,\"*" '{print $2}' Mytest.csv

или взять только первые поля x, используя разделитель нескольких символов :

awk -F"[@][$]" '{print $1,$2,$3,$4}' Mytest1.csv
где MyTest1 содержит вывод извлеченных данных Columnheader2

Но вместе весь лог c извлечения и последующего объединения вызывает некоторые проблемы. Может кто-то помочь здесь. Мне нужен один скрипт для работы с моим CSV и записи результатов в другой CSV, а вместо этого используется несколько CSV или текстовых выходов между ними?

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Это должно соответствовать обоим вашим требованиям:

awk -F',| *@[$] *' -v OFS='@$' -e 'NR==1 {print "outCol1","outCol2","outcol3"}; NR > 1 { print $3,$4,$5}' sample.txt

outCol1@$outCol2@$outcol3
192.168.1.1@$r1@$r2
192.168.1.1@$r1@$r2
  • -F',|@[$]' - field separator is a regular expression in awk, this will match both, and @ $ , and also trim the spaces around @ $ `
  • -v OFS='@$' - поле по умолчанию разделителем для вывода является пробел, для него будет установлено значение '@ $'
  • NR == 1 {print "outCol1","outCol2","outcol3"} - для первой строки выведите новый заголовок
  • NR > 1 { print $3,$4,$5} - для остальных строк напечатайте поля $ 3, $ 4, $ 5

Примечание: это предполагает, что в остальной части CSV не было экранированных символов , или @$, в противном случае вам следует использовать соответствующий CSV синтаксический анализатор.

0 голосов
/ 11 марта 2020

Это будет обрабатывать CSV безопасным способом, в отличие от большинства bash инструментов.

#!/usr/local/bin/python3

import csv
csvr = csv.reader(open('your_file.csv'), delimiter = ",")

results = []
index=0
for row in csvr:
    if index == 0:
        index = index +1
        continue
    results.append(row[1].split('@$')[1:])

for row in results:
    print(",".join(row))

Вывод:

 192.168.1.1 , r1 , r2 , POST API 
 192.168.1.1 , r1 , r2 , GET API

Надеюсь, это поможет!

0 голосов
/ 11 марта 2020

Использование awk для разделения на My_Test_Logs:

$ awk -F, '{print (split($2,a,/My_Test_Logs /)>1?a[2]:a[1])}' file

Вывод:

ColumnHeader2
@$ 192.168.1.1 @$ r1 @$ r2 @$ POST API 
@$ 192.168.1.1 @$ r1 @$ r2 @$ GET API 

Обновление:

В свете лучше представленный ожидаемый результат:

$ awk -F, '{print (split($2,a,/ /)>1?a[5] OFS a[6] OFS a[7] OFS a[8] OFS a[9] OFS a[10] OFS a[11] OFS a[12]:a[1])}' file

Вывод:

ColumnHeader2
192.168.1.1 @$ r1 @$ r2 @$ POST API
192.168.1.1 @$ r1 @$ r2 @$ GET API
...