Bash XSV 自动使用 CSV 列填充空值

Bash XSV auto populate empty values with CSV column

我有一个 CSV 导出文件,我需要将其映射到新值,以便随后导入到不同的系统中。我正在使用 ArangoDB 来创建这个数据迁移映射。

下面是使用的完整脚本:

#!/bin/bash

execute () {
    filepath=
    prefix=
    keyField=
    filename=`basename "${filename%.csv}"`
    collection="$prefix$filename"
    filepath="/data-migration/$filepath"

    # Check for "_key" column
    if ! xsv headers "" | grep -q _key
    # Add "_key" column using the keyfield provided
    then
        xsv select $keyField "" | sed -e "1s/$keyField/_key/" > "._key"
        xsv cat columns "" "._key" > ".cat"
        mv ".cat" ""
        rm "._key"
    fi

    # Import CSV into Arango Collection
    docker exec arango arangoimp --collection "$collection" --type csv "$filepath" --server.password ''
}

# This single line runs the execute() above
execute 'myDirectory/myFile.csv' prefix_ OLD_ORG_ID__C

到目前为止,我已经推导出 $keyField (OLD_ORG_ID__C) 参数传递给 execute() 函数,在循环中使用的脚本。这将查找 $keyField 列,然后使用 XSV toolkit.

将值迁移到新创建的 _key
OLD_ORG_ID__C | _key
  A123        ->  A123
  B123        ->  B123
              ->  ##    <-auto populate

不幸的是,并非每一行都有 OLD_ORG_ID__C 列的值,因此该行的 _key 也是空的,这会导致导入 Arango 失败。

注意:_key 字段是我的 AQL 脚本正常工作所必需的

如何重写循环以自动索引空白值?

then
    xsv select $keyField "" | sed -e "1s/$keyField/_key/" > "._key"
    xsv cat columns "" "._key" > ".cat"
    mv ".cat" ""
    rm "._key"
fi

有没有更好的方法来解决这个问题?也许 xsv sortkeyField 然后自动填充从空白行到末尾?

更新: 根据 comments/answer 我尝试了一些类似的方法,但到目前为止仍然没有用

#!/bin/bash

execute () {
    filepath=
    prefix=
    keyField=
    filename=`basename "${filename%.csv}"`
    collection="$prefix$filename"
    filepath="/data-migration/$filepath"

    # Check for "_key" column
    if ! xsv headers "" | grep -q _key
    # Add "_key" column using the keyfield provided
    then

        awk -F, 'NR==1 { for(i=1; i<=NF;++i) if ($i == "'$keyField'") field=i; print; next }
    $field == "" { $field = "_generated_" ++n }1'  > -test.csv

    fi

}
# import a single collection if needed
execute 'agas/Account.csv' agas_ OLD_ORG_ID__C

这会创建一个 Account-test.csv 文件,但遗憾的是它没有“_key”列或更改为 OLD_ORG_ID__C 值。最好我只想在 OLD_ORG_ID__C 为空白时看到用自动编号值填充的“_key”值,否则他们应该复制提供的值。

如果您的问题是"how can I find from the first header line of a CSV file which field is named OLD_ORG_ID__C, then on subsequent lines put a unique value in this column if it is empty",请尝试

awk -F, 'NR==1 { for(i=1; i<=NF;++i) if ($i == "OLD_ORG_ID__C") field=i ; print; next }
    $field == "" { $field = "_generated_" ++n }1' file >newfile

这没有提供处理复杂性的方法,例如带有嵌入式逗号的引用字段。 (我不知道 xsv 是什么,但也许它更适合这种情况?)

如果我能猜出这段代码的作用

xsv select $keyField "" |
sed -e "1s/$keyField/_key/" > "._key"

那么你可能可以用

之类的东西替换它
xsv select "$keyField" "" |
awk -v field="$keyField" 'NR==1 { [=12=] = field }
    /^$/ { [=12=] = NR } 1' >"._key"

$keyField 的值替换第一行,并用它们的行号替换任何后续空行。