“|” 分隔的檔案應具有以下列標題
Activity
Activity ID
Description
Status
上傳后,在開始使用 SQLLDR 處理檔案之前,我確保上傳的檔案具有準確數量的標題,標題名稱匹配且順序相同。
代碼:
declare -i header=4
fields=(
"Activity"
"Activity ID"
"Description"
"Status"
)
for i in "Test File.csv"; do
read -r line < "$i"
oldIFS="$IFS"
IFS=$'|'
fldarray=( $line );
IFS="$oldIFS"
nfields=${#fldarray[@]}
if (( nfields < header ))
then
printf "error: only '%d' fields in file '%s'\nmissing:" "$nfields" "$i"
else
for item1 in "${header[@]}"; do
for item2 in "${fields[@]}"; do
if [[ $item1 != $item2 ]]; then
Array3 =("$item1")
fi
done
done
echo "not matching" ${Array3[@]}
printf "\n\n"
fi
done
資料:
Activity|Activity ID|Description|Status
Test|1234|First activity|Open
這總是列印缺少 Activity 列,盡管它存在于檔案中。從頭檔案和上傳的檔案中洗掉“ ”后,它按預期作業。如何更改上述代碼以使用“ ”驗證列標題。我參考了bash的答案來識別和驗證檔案頭來構建這個解決方案
uj5u.com熱心網友回復:
注意:對于 OP 想要做什么仍然有點困惑(例如,header被定義為整數但后來被參考為陣列 ( "${header[@]}"))
假設:
- 如果檔案
|第一行中的分隔欄位.csv數與fields[]陣列中的條目數不匹配,則列印錯誤 - 檔案中的標頭欄位
.csv必須與fields[]陣列中的條目完全匹配(拼寫和順序) - 列印
fields[]陣列中與檔案|第一行中的分隔欄位不完全匹配的條目.csv
我們將保留當前fields[]陣列:
fields=("Activity" "Activity ID" "Description" "Status")
將.csv檔案的第一行拉入headers[]陣列:
IFS='|' read -r -a headers < test.csv # read first line from test.csv, break on '|' delimiter, store in headers[] array
給我們:
$ typeset -p fields headers
declare -a fields=([0]="Activity" [1]="Activity ID" [2]="Description" [3]="Status")
declare -a headers=([0]="Activity" [1]="Activity ID" [2]="Description" [3]="Status")
現在對OP的if/else/for/fi代碼進行一些修改:
if [[ "${#fields[@]}" -ne "${#headers[@]}" ]] # field count mismatch?
then
echo "error: field count mismatch: expecting ${#fields[@]} / found ${#headers[@]}"
else
Array3=() # init array Array3[]
for ((i=0;i<${#fields[@]};i )) # loop through indices of fields[] array
do
[[ "${fields[$i]}" != "${headers[$i]}" ]] && \ # if same position in both arrays is not a match then ...
Array3 =("${fields[$i]}") # add fields[] entry to Array3[]
done
[[ "${#Array3[@]}" -ne 0 ]] && \ # if Array3[] not empty then ...
echo "not matching:" ${Array3[@]} # print list of fields to stdout
fi
對于這種特殊情況,當${fields[@]}和${headers[@]}相同時,不會生成任何輸出。
其他測驗用例:
headers[] 中的第二個欄位拼寫不同
declare -a fields=([0]="Activity" [1]="Activity ID" [2]="Description" [3]="Status")
declare -a headers=([0]="Activity" [1]="Activity " [2]="Description" [3]="Status")
# the code generates:
not matching: Activity ID
headers[] 有 3 個條目
declare -a fields=([0]="Activity" [1]="Activity ID" [2]="Description" [3]="Status")
declare -a headers=([0]="Activity" [1]="Activity ID" [2]="Status")
# the code generates:
error: field count mismatch: expecting 4 / found 3
headers[] 有 4 個條目,但都與 fields[] 中的相應條目不同
declare -a fields=([0]="Activity" [1]="Activity ID" [2]="Description" [3]="Status")
declare -a headers=([0]="Activity ID" [1]="Description" [2]="Status" [3]="Activity")
# the code generates:
not matching: Activity Activity ID Description Status
從這里 OP 應該能夠調整代碼以提供所需的輸出和/或設定一些變數以用于后續條件操作(例如,如果echo觸發任何一個則中止處理,如果觸發任何一個則禁用后續處理echo等)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/339888.html
上一篇:如何使用Linuxcmd根據兩個檔案的公共列丟棄行?
下一篇:如何捕獲有關HDFS上檔案的資訊
