0

我有一个 CSV 导出,我需要将其映射到新值,然后才能导入到不同的系统中。我正在使用 ArangoDB 创建此数据迁移映射。

以下是使用的完整脚本:

#!/bin/bash

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

    # Check for "_key" column
    if ! xsv headers "$1" | grep -q _key
    # Add "_key" column using the keyfield provided
    then
        xsv select $keyField "$1" | sed -e "1s/$keyField/_key/" > "$1._key"
        xsv cat columns "$1" "$1._key" > "$1.cat"
        mv "$1.cat" "$1"
        rm "$1._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列,然后_key使用XSV 工具包将值迁移到新创建的列。

OLD_ORG_ID__C | _key
  A123        ->  A123
  B123        ->  B123
              ->  ##    <-auto populate

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

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

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

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

有没有更好的方法来解决这个问题?也许xsv sort通过keyField然后自动填充从空白行到最后?

更新:根据评论/答案,我尝试了一些类似的方法,但到目前为止仍然无法正常工作

#!/bin/bash

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

    # Check for "_key" column
    if ! xsv headers "$1" | 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' $1 > $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值更改。最好我只想看到填充了自动编号值的“_key”值OLD_ORG_ID__C,否则它们应该复制提供的值。

4

1 回答 1

0

如果您的问题是“我如何从 CSV 文件的第一个标题行中找到名为哪个字段OLD_ORG_ID__C,然后在后续行中,如果该列为空,则在该列中放置一个唯一值”尝试类似

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 "$1" |
sed -e "1s/$keyField/_key/" > "$1._key"

那么也许你可以用类似的东西代替它

xsv select "$keyField" "$1" |
awk -v field="$keyField" 'NR==1 { $0 = field }
    /^$/ { $0 = NR } 1' >"$1._key"

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

于 2018-11-27T19:04:14.797 回答