Электронная почта в CSV C # - строка неправильно форматирует - PullRequest
0 голосов
/ 05 июня 2018

Таким образом, в настоящее время я анализирую электронные письма, которые мы получаем с работы, все они отформатированы почти одинаково, и я получаю нужные мне данные из всех них, однако у меня возникают проблемы с получением «описания», который входит в несколько строк.Я попытался удалить "\ n" из этих строк, но это не всегда работает.Когда я открываю файлы .csv, иногда форматирование проходит нормально, но в противном случае эти дополнительные возвраты в строках разрушают все.

Вот мой код:

    public static void Main(string[] args)
    {
        helper();
        Console.WriteLine("Press any key to exit ... ");
        Console.ReadKey();

    } //end main method

    public static void helper()
    {
        //initiate outlook
        Microsoft.Office.Interop.Outlook.Application app = null;
        Microsoft.Office.Interop.Outlook._NameSpace ns = null;
        Microsoft.Office.Interop.Outlook.MailItem item = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder subFolder = null;

        try
        {
            app = new Microsoft.Office.Interop.Outlook.Application();
            ns = app.GetNamespace("MAPI");
            ns.Logon(null, null, false, false);

            inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
            subFolder = inboxFolder.Folders["WorkOrders"]; //folder.Folders[1];
            Console.WriteLine("Folder Name: {0}", subFolder.Name);
            Console.WriteLine("Number of Emails: {0}", subFolder.Items.Count.ToString());
            Console.WriteLine();
            Console.WriteLine("-------------------------");
            Console.WriteLine();

            //Variables for loop
            String sub;
            String date;
            String time;
            String body;
            String desc;
            String storeNumber;
            String workOrderNumber;
            int indexOfDesc;
            int indexOfSp;
            int items = subFolder.Items.Count;

            DataTable dt = new DataTable();
            dt.Columns.Add("Work Order Number");
            dt.Columns.Add("Date");
            dt.Columns.Add("Store Number");
            dt.Columns.Add("Description");
            dt.Rows.Add("Work Order Number", "Date", "Store Number", "Description");
            dt.Rows.Add("", "", "", ""); // just a blank row

            for (int i = 1; i <= items; i++)
            {
                item = (Microsoft.Office.Interop.Outlook.MailItem)subFolder.Items[i];
                sub = item.Subject;
                date = item.SentOn.ToLongDateString();
                body = item.Body;
                desc = "";
                storeNumber = sub.Substring(0, 5);
                workOrderNumber = sub.Substring(sub.Length - 10);
                indexOfDesc = body.IndexOf("Description Overview:");
                indexOfSp = body.IndexOf("Safety Precautions:");
                desc = body.Substring(indexOfDesc, indexOfSp - indexOfDesc);
                desc = desc.Replace("\t", string.Empty);
                desc = desc.Replace("\n", string.Empty);

                // Add row in data table
                dt.Rows.Add(workOrderNumber, date, storeNumber, desc);

                // Process Date
                createCSV(dt);

                // *** Console Output for testing *** //
                Console.WriteLine("Index: {0}", i.ToString());
                Console.WriteLine("Store Number: {0}", sub.Substring(0, 5));
                Console.WriteLine("Work Order Number: # " + workOrderNumber);
                Console.WriteLine("Sent: {0}", date);
                Console.WriteLine(desc);
                Console.WriteLine();
                Console.WriteLine("-------------------------");
                Console.WriteLine();
            }

            PrintTable(dt);
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            ns = null;
            app = null;
            inboxFolder = null;
        } //end finally

    }

    private static void PrintTable(DataTable dt)
    {
        DataTableReader dtReader = dt.CreateDataReader();
        while (dtReader.Read())
        {
            for (int i = 0; i < dtReader.FieldCount; i++)
            {
                Console.Write("{0} = {1} ",
                    dtReader.GetName(i).Trim(),
                    dtReader.GetValue(i).ToString().Trim());
            }
            Console.WriteLine();
        }
        dtReader.Close();
    }

    /**
     * createCSV(DataTable dt) takes each line from data 
     * table and appends it to a csv file created at the var path
     * @param dt - DataTable 
     **/
    public static void createCSV(DataTable dt)
    {
        String path = "C:\\Users\\WORK\\Desktop\\test.csv";
        StringBuilder sb = new StringBuilder();
        foreach(DataRow dr in dt.Rows){
            foreach(DataColumn dc in dt.Columns){
                sb.Append(FormatCSV(dr[dc.ColumnName].ToString()) + ",");
            } // end foreach
            sb.Remove(sb.Length-1,1); //remove comma
            sb.AppendLine();
        } // end foreach
        File.WriteAllText(path, sb.ToString());
    } // end createCSV()

    public static string FormatCSV(string input)
    {
        try
        {
            if (input == null)
                return string.Empty;

            bool containsQuote = false;
            bool containsComma = false;
            int len = input.Length;
            for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++)
            {
                char ch = input[i];
                if (ch == '"')
                    containsQuote = true;
                else if (ch == ',')
                    containsComma = true;
            }

            if (containsQuote && containsComma)
                input = input.Replace("\"", "\"\"");

            if (containsComma)
                return "\"" + input + "\"";
            else
                return input;
        }
        catch
        {
            throw;
        }
    }

} //end class

А вот скриншот того, как выглядит CSV-файл.Имейте в виду, во всех описаниях в электронном письме есть лишние пробелы и прочее, и я выделил строки, которые работали так, как я хочу, тоже: никаких лишних пробелов, только одна строка правильной информации.Вы можете увидеть, как результаты разрушают электронную таблицу.Image of the CSV - file opened in excel

Так что любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 06 июня 2018

Одна проблема при работе с символами новой строки заключается в том, что иногда это не стандартный CRLF (\r\n), который использует Windows.Иногда это просто \r, а иногда просто \n.

Если у вас нет контроля над символом перевода строки, это может быть достойной защитной сеткой для замены всех трех.

var sub = string.Empty;
var foo = myString.Replace("\r\n", sub).Replace("\r", sub).Replace("\n", sub);

Это исправляет те случаи, когда вы получаете, скажем,

Some line item\r\n Another line item\n Last line item\r

Удаление только \n может нормально работать в одном приложении, но другое приложение, отображающее ту же строку, может по-прежнему помещать ее в новую строку.

...