Shell操作csv文件 通过条件检索判断输出某一项的值,并使用字典进行速度优化

我们利用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]}
        break

 fi 

此处为逻辑代码,本处意思是如果当前行的第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为通过字典查询键而返回的行号

 注意:使用字典存值得时候需要保证数据唯一行,第一次循环结束后,如果值相同,后面的值会把前面的值覆盖

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值