我有一个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
列,然后使用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 "$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
值。最好当OLD_ORG_ID__C
为空时,我只想看到自动编号值填充的“ _key”值,否则它们应该复制提供的值。
答案 0 :(得分: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
的值,并将其后的空行替换为其行号。