.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

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

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

#!/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

관련 정보