AWKを使用してCSVを解析し、改行を使用してbash varにフィールドを返します。

AWKを使用してCSVを解析し、改行を使用してbash varにフィールドを返します。

APIを使用する新しいアプリケーションに移行するには、パスワードデータベース(Keepass)のcsvファイルを使用する必要があります。 API は、JSON データ型を必要とするパブリッシュ要求を通じて更新されます。私がしなければならないのは、KeePass CSVを使用してAPIに関連付けられたパスワードやその他の情報をエクスポートすることです。私はbashとawkを使ってスクリプトを書くことにしました。

csvファイルの列は次のように配列されます。

"Group","Title","Username","Password","URL","Notes","TOTP","Icon","Last Modified","Created"

一部のコメントには改行があるため、「説明」フィールドは複数行です。

"That's an important note, <br/>
some extra infos <br/>
concerning a password"

以下は、データを公開するためのAPIリクエストの例です。データフィールドはJSON形式です。

このリクエストに必要なフィールドをすべて追加したわけではありませんが、すでにどのように機能するかを確認できます。 KeePass と API フィールド名が異なるため、一部のフィールド名が異なります。

var1=name
var2=my.name
var3=password456

curl -s --request PUT -u username123:password123 -H 'Content-Type: application/json; charset=utf-8' https://tpm.mydomain.com/index.php/api/v5/passwords/1659.json --data-binary @- <<DATA
{
"name": "$var1",
"username": "$var2",
"password": "$var3"
}
DATA

私のCSVファイルフィールドをフィールドごとに解析し、行解析を完了したら、データベースにパスワードを公開するようにAPIリクエストを行う予定です。次に、残りの行ごとにこれを行います。

CSVを処理するために、私の場合は非常に便利で便利なようなAWK言語を見つけました。 gsubコマンドを使用して私のファイルを何度もテストしましたが、これは改行文字(\ n)を置き換えるのに役立ちました。どうやって進むべきかわかりません。以下はその一部です(最初の項目のみが機能します。

cat keepass.csv | awk NF=NF RS=/\n/ OFS=\n
cat keepass.csv |awk 'BEGIN {RS=","}{gsub("/\n/","",$0); print $0}'
cat keepass.csv | awk 'BEGIN {RS=""}{gsub(/\n/,"",$6); print $0}'

また、awkの後に-vを追加してbash varを共有できることを知っています。これは私が得ることができる最も近いコードです。

awk -v RS='"\n' -v FPAT='"[^"]*"|[^,]*' '{
print "Row n°", NR, ""
for (i=1; i<=NF; i++) {
sub(/^"/, "", $i)
printf "Field %d, value=[%s]\n", i, $i
}} keepass.csv

私が探しているのは、複数行のコメントを考慮してcsvのすべての列を解析し、それをJSON形式でbashのグローバル変数に入力するコマンドです。

次のようにしてビルドする必要があると思います。

awk -v 'BEGIN{parsing and replacing keeping '\n' of notes}
if end of row,
return boolean to bash for processing the API requests, wait,
restart the loop}''

私はスクリプトが初めてで、数行で完了することができると思いますが、どのように進むべきかわかりません。必要に応じて言語をPythonに変更し、コードにいくつかのツールを追加できます。

答え1

複数行はCSVセルの機能であり、CSV認識ユーティリティを使用できます。ミラー

たとえば、次のような場合このCSVファイル君は走れるよ

  • mlr --csv cut -f fieldA acr.csv最初の列を切り取る
  • mlr --icsv --ojson cut -f fieldA acr.csv最初の列を切り取り、すべて次に変換します。JSON
[
  {
    "fieldA": "That's an important note,\nsome extra infos\nConcerning a password\nIpsum"
  },
  {
    "fieldA": "hello"
  }
]

ご覧のとおり、Millerはセルキャリッジリターン文字(RFC4180準拠)。

以下はサンプル入力ファイルのイメージです。

ここに画像の説明を入力してください。

答え2

「説明」フィールドは複数行です。

いいえ! CSVは複数行をサポートしません。絶対にしないでください。

複数行の文字列をCSVに保存する必要がある場合は、2つの一般的な方法があります。

  1. \n元の文字列の文字を別の文字に変更します。通常、2 文字の "\n" 文字列です。
  2. レコード区切り文字を\n文字列に表示されない他の文字に変更します。通常はそうです\x01

最初の方法は追加の事前変換と後変換が必要ですが、かなり安定しています。

2番目の方法は非常に優れており、簡単に動作しますが、CSVをサポートするすべてのアプリケーションがレコード区切り文字を変更できるわけではなく、レコード区切り文字として使用されている文字がフィールド内に表示される可能性が常にあります。

何らかの理由でファイルを再生成して正しいCSVにすることができない場合は、ループを使用することをお勧めします。

while read row
 if row has 6 fields ("Notes" is a 6th field)
   do
     append "\n" to it
     append next row to it
   repeat until the working row has 10 fields
   export the work row to output file
 end if
end while

どんな言語でも可能です(でもbash)。

関連情報