.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

정보를 분할하는 방법은 다음과 같습니다. MsgID, 날짜, 받는 사람, 참조, 숨은 참조, 제목, 본문, 상태, 타임스탬프

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

내가 겪고 있는 문제는 두 가지 이유로 본문 부분에 있습니다. 스크립트를 실행하려고 할 때 텍스트의 ","가 끊어지고 다른 이유는 텍스트의 줄 바꿈입니다.

이것은 내가 하고 있던 스크립트입니다:

#!/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를 사용하고 있는 것 같습니다 . 해당 도구가 설치된 작업 시스템에 액세스할 수 없으므로 위의 메일 전송 스크립트를 테스트할 수 없습니다. 그래도 적어도 좋은 시작은 되어야 합니다.

답변2

Miller(https://github.com/johnkerl/miller), 구조화된 텍스트 데이터 작업에 특화되어 있습니다.

input.txt이 파일 에서 시작하는 예에서는

#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

그리고 달리는 중

mlr --implicit-csv-header --c2x cat then label MsgID,Date,To,CC,BCC,Subject,Body,Status,Timestamp input.txt

당신은 할 것

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

본문 필드에서 캐리지 리턴을 제거하려면 다음을 실행할 수 있습니다.

mlr --implicit-csv-header --c2x cat then label MsgID,Date,To,CC,BCC,Subject,Body,Status,Timestamp then put '$Body=gsub($Body,"\n"," ")' input.txt

갖다

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

관련 정보