Таким образом, в настоящее время я анализирую электронные письма, которые мы получаем с работы, все они отформатированы почти одинаково, и я получаю нужные мне данные из всех них, однако у меня возникают проблемы с получением «описания», который входит в несколько строк.Я попытался удалить "\ 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-файл.Имейте в виду, во всех описаниях в электронном письме есть лишние пробелы и прочее, и я выделил строки, которые работали так, как я хочу, тоже: никаких лишних пробелов, только одна строка правильной информации.Вы можете увидеть, как результаты разрушают электронную таблицу.
Так что любая помощь будет очень признательна.