【问题标题】:How can I select a sqlite column with multiple lines in bash?如何在 bash 中选择具有多行的 sqlite 列?
【发布时间】:2014-02-07 05:41:48
【问题描述】:

我有一个 sqlite 数据库表,其中包含存储名称、位置和注释的三列。似乎所有内容都正确存储,因为在使用 sqlite 命令行时,我看到了正确的列数并且数据分组正确。

使用 bash 脚本(这是一项要求)访问数据时会出现问题。 “注释”列存储可能是多行的数据(带有换行符等)。当我查询此表时,使用如下内容:

stmt="Select name, location, notes from t1"  
sqlite3 db "$stmt" | while read ROW;   
do  
  name=`echo $V_ROW | awk '{split($0,a,"|"); print a[1]}'`  
  location=`echo $V_ROW | awk '{split($0,a,"|"); print a[2]}'`  
  notes=`echo $V_ROW | awk '{split($0,a,"|"); print a[3]}'`  
done

在注释列中的第一个换行符之前,一切正常。在此之后,每个注释行都被视为一个新行。在 bash 中处理这个问题的正确方法是什么?

【问题讨论】:

  • 你应该看看.mode命令到sqlite3。

标签: bash sqlite


【解决方案1】:

由于数据是管道分隔的,您可以这样做(未经测试):将每一行读入一个数组;检查数组的大小

  • 如果有 3 个字段,那么您有来自 db 的一行,但 notes 字段可能不完整。对 previous 行执行一些操作,该行现在有一个完整的注释字段。
  • 如果找到 1 个字段,则将该字段值附加到当前备注字段。
  sqlite3 db "$stmt" | {
    full_row=()
    while IFS='|' read -ra row; do  
      if [[ ${#row[@]} -eq 3 ]]; then
        # this line contains all 3 fields
        if [[ ${#full_row[@]} -eq 0 ]]; then
           : # "row" is the first row to be seen, nothing to do here
        else
           name=${full_row[0]}
           location=${full_row[1]}
           notes=${full_row[2]}
           do_something_with "$name" "$location" "$notes"
           #
           # not necessary to use separate vars
           # do_something_with "${row[@]}"
        fi
        # then store the current row with incomplete notes
        full_row=( "${row[@]}" )     
      else
        # only have notes.
        full_row[2]+=" "${row[0]}
      fi
    done
  }

您最好采取措施确保备注字段不包含您的字段分隔符 (|)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多