使用从CSV文件

时间:2016-02-20 12:16:50

标签: macos bash csv

我有一个独特的挑战:我有一个CSV文件,我需要从中提取文本,然后使用该文本发送电子邮件。这是一次性问题,电子邮件需要在同一天发送。谷歌有option类似的东西,但我需要发送超过100封电子邮件的每日配额。使用SMTP而不是脚本使用不同的配额,因此如果我走这条路线,我将能够在一天内发送我需要的所有电子邮件。

我已经完成了一些挖掘,发送电子邮件的基本代码似乎是这样的:

    $ echo "This will go into the body of the mail." | mail -s "Subject" recipient@email.com

    $ mail -s "Subject" recipient@email.com < /file/location/address.csv

到目前为止很棒,但我需要它从CSV文件和正文文本中提取主题行,当它到达逗号分隔符时停止,然后标记或删除源CSV文件中的文本,以便它知道它已发送该电子邮件但不重复。最后,它需要移动到下一行并重复该过程,直到它完成整个CSV文件。

理想情况下,我应该能够在OS X中从终端执行它并观察进度。 (如果可能的话,我希望包含&#39; sleep&#39;命令在它到达每个分隔符后引入小暂停,以使shell输出可理解而不是无休止的文本流。)

我有大部分代码的基本代码段,但我不确定如何从CSV文件中提取信息并将其传输到我已有的内容中。如果有人能指出我正确的方向,我想我应该能够把它拼凑在一起。

编辑:如果在bash之外使用其他脚本语言更容易,我可以拼凑一切,但提取文本并将其输入另一个命令/输出。大多数语言都有简单的命令和库,所以我应该能够谷歌并蚕食其余的代码。它将CSV文件中的内容发送到我不知道该怎么做的电子邮件中,尽管Google重复搜索。 (另外,如果您认为我使用的是错误的搜索字词,请随时提出更好的搜索字词。)

1 个答案:

答案 0 :(得分:1)

你可以这样做:

#!/bin/bash

#get line count
linecount=$(cat mycsv.csv  | wc -l)
#set counting variable
counter=1
#loop through file
while read line; do 
    #split each line into an array by comma
    IFS=, read -a arr <<< "$line"; 
    #set  array values to variables
    subject="${arr[0]}"; 
    intro="${arr[1]}"; 
    details="${arr[2]}"; 
    closing="${arr[3]}"; 
    #create body
    body=$(printf "Intro: %s \n Details: %s \n Closing: %s" "$intro" "$details" "$closing")
    #echo progress
    echo "Sending email $counter of $linecount: Subject: $subject, Body: $body"
    #send email
    echo "$body" | mail -s "$subject" recipient@email.com 
    #advance counter
    counter=$(( $counter +1 ))
    #sleep for a second
    sleep 1
done < mycsv.csv 

上面会输出:

Sending email 1 of 2: Subject: subject, Body: Intro: intro 
 Details: details 
 Closing: closing

您也可以通过这种方式格式化电子邮件的正文。请注意,如果您执行此操作,关闭电子邮件正文的第二个EOF必须一直到文件的左侧,行的开头和EOF之间没有空格。

    #send email
    mail -s "$subject" recipient@email.com <<EOF
    "$intro"
    "$details"
    "$closing"
EOF

mycsv.csv的样子:

subject,intro,details,closing
subject1,intro1,details1,closing1

我无法访问OSX,因此使用GNU bash版本4.3.42测试:

bash --version
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)