我需要決議一個 CSV 檔案的內容,它的內容會發生變化,而沒有任何建議。因此,有時我會收到包含以下內容的檔案:
“否,緯度,經度,名稱,高度,衛星,日期,時間”
和其他一些人與這個..
“否,緯度,經度,姓名,海拔,日期,時間”
或者其他(總是具有相同的內容..但有時 5 列..其他一些 6 列...等等。我的意思是..有時我想念名稱..或衛星...或兩者兼而有之)
因此.. 我需要閱讀并理解每列的內容,以便詳細說明具有(始終)相同內容的固定 CSV:
“否,緯度,經度,名稱,高度,衛星,日期,時間”
為了做到這一點,我在考慮:
- 閱讀標題并為每一列分配一些值:
IFS=",";read -r a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] a[11]
這是為了閱讀標題
我需要創建的標題的相同程序(我知道的那個):
IFS=",";read -r b[1] b[2] b[3] b[4] b[5] b[6] b[7] <<< "No,Latitude,Longitude,Name,Altitude,Satellites,Date,Time"
- 為 A 陣列的每個非空值運行一個回圈.. 嘗試匹配 B 陣列的任何標題
do
for x in [1..7]
do
if [[ ${a[i]} = ${b[x]} ]]
then
# The column i from my source file belongs to the column x of my output file
output[$x]=$i
fi
done
done
- 將其存盤在我的新檔案中.. 使用類似的東西。
IFS=","; while read -r a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] a[11]
do
echo "${a[output[1]]}, ${a[output[2]]},${a[output[3]]},${a[output[4]]},${a[output[5]]},${a[output[6]]},${a[output[7]]}" >> new.csv
done < source.csv
我認為這應該可行,因為它將適當的源列記錄到所需的最終列中......
但是..我敢肯定,有很多方法可以更輕松、更優雅地做到這一點..
有什么幫助嗎?
謝謝
uj5u.com熱心網友回復:
米勒 擁有的template 動詞正是這種任務:
mlr 模板 [選項]
按列名串列指定的順序放置輸入記錄欄位。
如果輸入記錄缺少指定的欄位,它將用fill-with 填充。
如果輸入記錄有一個未指定的欄位,它將被丟棄。
選項:
-f {a,b,c}模板的逗號分隔欄位名稱。
-t {filename}CSV 檔案,其標題行將用于模板。
--fill-with {filler string}用什么填充缺席的欄位。默認為空字串。
所以你可以這樣做:
mlr --csv template \
-f 'No,Latitude,Longitude,Name,Altitude,Satellites,Date,Time' \
--fill-with '0' \
file.csv
或者使用其他檔案的標題作為參考:
mlr --csv template -t header.csv --fill-with '0' file.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490632.html
