我们利用shell进行文件操作时,往往会需要将csv中某一项的值进行某种逻辑判断,而后在进行输出它某一项的值。
一 将CSV文件读入数组中
也可以对csv文件进行直接操作,但是不建议,因为应用起来会进行反复的开闭文件,相当影响性能,所以将文件读入数组中,这样既节约了反复开闭的时间,又方便操作。
LX_INFILE_DIR=/路径/路径
OLDIFS=$IFS
IFS=$'\r\n'
LX_Array=($(cat ${LX_INFILE_DIR}/***.csv))
IFS=$OLDIFS
这里的操作是将csv文件数组化,其中IFS=$'\r\n' 是以换行符为基准进行数组化分割
二 循环csv文件
接下来循环遍历需要处理的csv文件
# #LX_Array[*] 为数组长度
constructionNumber=3
completionDivision=
for ((j = 1; j <= ${#LX_Array[*]}; j++)); do
OLD_IFS="$IFS"
IFS=","
LX_Rows_Array=(${LX_Array[j]})
IFS="$OLD_IFS"
if [ "${LX_Rows_Array[1]}" == "${constructionNumber}" ]; then
completionDivision=${LX_Rows_Array[11]}
break
fi
done
unset j
OLD_IFS="$IFS"
IFS=","
LX_Rows_Array=(${LX_Array[j]})
IFS="$OLD_IFS"此处为将当前行的数据,以“,”分割,存为当前行的数组
if [ "${LX_Rows_Array[1]}" == "${constructionNumber}" ]; then
completionDivision=${LX_Rows_Array[11]}
breakfi
此处为逻辑代码,本处意思是如果当前行的第2项等于3的话,将第12项的数赋值给completionDivision
使用过后记得释放j unset j
三 适用字典进行代码优化
一旦当前csv文件数据量很大,几万甚至十几万的数据,而且需要反复循环此文件的情况。那么处理起来将会十分的慢,虽然匹配成功后会break,一旦匹配的数据处于csv末端的话还是十分的慢的。此时可以使用字典,进行一个键值对的创建,只需要遍历一遍,往后的查询将会非常快速。
1 声明字典
declare -A dicT_LX_Array
2 初始化字典
dicT_MK_Array=()
3 存储键值
for ((j = 1; j <= ((${#LX_Array[*]} - 1)); j++)); do
OLDIFS=$IFS
IFS=$','
T_LX_Rows_Array=(${LX_Array[j]})
IFS=$OLDIFS
T_LXKey=${T_LX_Rows_Array[1]}
dicT_LX_Array+=([${T_LXKey}]=$j)
done
unset j
#
### T_LXKey 存放的是键
### dicT_LX_Array+=([${T_LXKey}]=$j) 是将键T_LXKey,与值 j(这里存放的是行号)
### 存入字典dicT_LX_Array
4 调用
constructionNumber=3
completionDivision=
LX_NO=${dicT_MK_Array["${constructionNumber}"]}
OLDIFS=$IFS
IFS=$','
LX_Rows_Array=(${LX_Array["${MK_NO}"]})
IFS=$OLDIFS
completionDivision=${LX_Rows_Array[11]}
#
### LX_NO为通过字典查询键而返回的行号
注意:使用字典存值得时候需要保证数据唯一行,第一次循环结束后,如果值相同,后面的值会把前面的值覆盖