我有一个 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
,否则它们应该复制提供的值。