Вот пример данных:
Col_01:14 .... Col_20:25 Col_21:23432 Col_22:639142
Col_01:8 .... Col_20:25 Col_22:25134 Col_23:243344
Col_01:17 .... Col_21:75 Col_23:79876 Col_25:634534 Col_22:5 Col_24:73453
Col_01:19 .... Col_20:25 Col_21:32425 Col_23:989423
Col_01:12 .... Col_20:25 Col_21:23424 Col_22:342421 Col_23:7 Col_24:13424 Col_25:67
Col_01:3 .... Col_20:95 Col_21:32121 Col_25:111231
Как видите, некоторые из этих столбцов расположены не в том порядке...
Теперь я думаю, что правильный способ импортировать этот файл в фрейм данных - это предварительно обработать данные, чтобы вы могли вывести фрейм данных со значениями NaN
, например.
Col_01 .... Col_20 Col_21 Col22 Col23 Col24 Col25
8 .... 25 NaN 25134 243344 NaN NaN
17 .... NaN 75 2 79876 73453 634534
19 .... 25 32425 NaN 989423 NaN NaN
12 .... 25 23424 342421 7 13424 67
3 .... 95 32121 NaN NaN NaN 111231
Решение было показано @JamesBrown здесь: Как предварительно обработать и загрузить файл tsv с большими данными в кадр данных python?
Используя указанный awk-скрипт:
BEGIN {
PROCINFO["sorted_in"]="@ind_str_asc" # traversal order for for(i in a)
}
NR==1 { # the header cols is in the beginning of data file
# FORGET THIS: header cols from another file replace NR==1 with NR==FNR and see * below
split($0,a," ") # mkheader a[1]=first_col ...
for(i in a) { # replace with a[first_col]="" ...
a[a[i]]
printf "%6s%s", a[i], OFS # output the header
delete a[i] # remove a[1], a[2], ...
}
# next # FORGET THIS * next here if cols from another file UNTESTED
}
{
gsub(/: /,"=") # replace key-value separator ": " with "="
split($0,b,FS) # split record from ","
for(i in b) {
split(b[i],c,"=") # split key=value to c[1]=key, c[2]=value
b[c[1]]=c[2] # b[key]=value
}
for(i in a) # go thru headers in a[] and printf from b[]
printf "%6s%s", (i in b?b[i]:"NaN"), OFS; print ""
}
И поместите заголовки в текстовый файл cols.txt
Col_01 Col_20 Col_21 Col_22 Col_23 Col_25
Теперь мой вопрос: как нам использовать awk, если у нас есть данные не column: value
, а column: value1: value2: value3
?
Мы хотели бы, чтобы запись в базе данных была value1: value2: value3
Вот новые данные:
Col_01:14:a:47 .... Col_20:25:i:z Col_21:23432:6:b Col_22:639142:4:x
Col_01:8:z .... Col_20:25:i:4 Col_22:25134:u:0 Col_23:243344:5:6
Col_01:17:7:z .... Col_21:75:u:q Col_23:79876:u:0 Col_25:634534:8:1
Мы по-прежнему заранее предоставляем столбцы с cols.txt
Как мы можем создать аналогичную структуру базы данных? Можно ли использовать gsub()
для ограничения первого значения перед :
, которое совпадает с заголовком?
РЕДАКТИРОВАТЬ: это не должно быть основано на awk. Любой язык подойдет естественно
@
? Удачи. - person shellter   schedule 05.10.2016Col_23: 79876:u:0
выводилосьCol_23:78976@u@0
. Тогда вы можете легко использоватьsplit(fld,fldArr,":");split(FldArr[2],valArr,"@")
. Удачи. - person shellter   schedule 05.10.2016Col_1:A:##
, либоCol_3:Z:##
- person ShanZhengYang   schedule 05.10.2016valeu1:value2:valeu3
. Это опечатка или реалистичные данные? - person glenn jackman   schedule 05.10.2016Col_01: 8: z
? Это опечатка. Между двоеточиями нет пробелов. Реалистичные данные больше похожи на то, что все поля Col1 будут иметь форматCol1:string:number
, где строка начинается с H. Col22 всегда будет иметь форматCol22:##:A:##
, где это всегда буква A. Остальные могут бытьfield_value:number
, парой ключ-значение. - person ShanZhengYang   schedule 05.10.2016