Bash XSV автоматически заполняет пустые значения столбцом CSV - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть экспорт 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 toolkit .

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 пусто, в противном случае они должны копировать предоставленное значение.

1 Ответ

0 голосов
/ 27 ноября 2018

Если ваш вопрос «как я могу найти из первой строки заголовка 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 и заменить любые последующие пустые строки их номером строки.

...