.csvから二重引用符間の情報を抽出する

.csvから二重引用符間の情報を抽出する

.csvファイルを解析するスクリプトにはいくつかの問題があります。

.csvに関する情報:

#1,13/8/2020,[email protected],[email protected],,Subject,"Dear Dude,

Information have been updated. Please login to APP to review by 30th August 2020. Thank you.

Best regards,
Mr. Mack",Pending,13/8/2020 12:35

情報を分割する方法は次のとおりです。 メッセージID、日付、受信者、参照、隠し参照、件名、本文、ステータス、タイムスタンプ

MsgID=#1
Date=13/8/2020
[email protected]
[email protected]
BCC=
Subject=Subject
Body=Dear Dude,
Information have been updated. Please login to APP to review by 30th August 2020. Thank you.
Best regards,
Mr. Mack
Status=Pending
Timestamp=13/8/2020 12:35

私が経験している問題は、2つの理由で本文セクションにあります。スクリプトを実行しようとすると、テキストの「、」が壊れ、他の理由はテキストの改行です。

これは私がやっているスクリプトです:

#!/bin/bash

export TIMESTAMP="$( date '+%d/%m/%Y %H:%M:%S' )"
INPUT=/tmp/test.csv
OUTPUT=/tmp/test.csv.out
OLDIFS=$IFS
IFS=','
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read msgid dat to cc bcc subject body status timesta
do
        echo "MSG ID : $msgid" 
        echo "Date : $dat"
        echo "To : $to"
        echo "CC : $cc"
        echo "BCC : $bcc"
        echo "Subject : $subject"
        echo "Body : $body"
        echo "Status : $status"
        echo "Timestamp : $timesta"
echo $body | mail -s "$subject" $to -c $cc -b $bcc
printf "$msgid,$dat,$to,$cc,$bcc,$subject,$body,Sent,$TIMESTAMP" >> $OUTPUT
done < $INPUT
IFS=$OLDIFS

ベストアンサー1

殻はただ非常に悪いテキスト解析ツール。最も簡単な作業にのみ使用する必要があり、おそらくその作業も使用しません。遅く、非効率的で、構文が複雑でエラーが発生しやすく、最も基本的なテキスト処理ツールでさえ欠けていました。それに加えて、CSVは入れ子になって複数の行エントリを可能にする複雑な形式です。シェルでCSVファイルを解析しようとすると、問題が発生するだけです。

したがって、CSV解析をサポートする正しいプログラミング言語を使用してください。たとえば、Pythonでは次のようになります。

#!/bin/python3
import csv
import sys

with open(sys.argv[1], newline='') as csvfile:
    fieldnames = ("MsgID","Date","To","CC","BCC",
                  "Subject","Body","Status","Timestamp")
    reader = csv.reader(csvfile, delimiter=',',
    for row in reader:
        for fieldName, value in zip(fieldnames,row):
            print("%s: %s" % (fieldName,value))

上記のスクリプトを次のように保存しましたfoo.py

MsgID: #1
Date: 13/8/2020
To: [email protected]
CC: [email protected]
BCC: 
Subject: Subject
Body: Dear Dude,

Information have been updated. Please login to APP to review by 30th August 2020. Thank you.

Best regards,
Mr. Mack
Status: Pending
Timestamp: 13/8/2020 12:35

ご覧のとおり、すべてのフィールドを正しく識別しました。したがって、メッセージを送信するには、次の手順を実行できます(ここで修正済み)。

#!/bin/python3
import csv
import sys
import subprocess
import os

def send_message(to, cc, bcc, subject, body):
    try:
        process = subprocess.Popen(['mail', '-s', subject, '-c', cc, '-b', bcc, to],
                                   stdin=subprocess.PIPE)
    except Exception as error:
      print(error)
    process.communicate(body)


with open(sys.argv[1], newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    for row in reader:
        (msgID, date, to, cc, bcc, subj, body, status, timestamp) = row
        send_message(to, cc, bcc, subj, body)

mail免責事項:あなたが持っているオプションに従ってBSDを使用しているようです。ツールがインストールされているジョブシステムにアクセスできないため、上記のメール転送スクリプトをテストできません。それでも、少なくとも良いスタートは必要です。

おすすめ記事