-1
這是我遇到的一個相當簡單的問題,但我的知識非常有限。我有一個將現有數據庫變成CSV的程序;但是,許多字段都包含逗號,我需要它們才能逃脫。我已經嘗試了一些無用的東西(在ObjectToCsvData下),所以任何與包含片段的幫助將不勝感激。逗號在stringbuilder中逃脫
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Reflection;
namespace OfaSort
{
public static class Utility
{
public static string CollectionToCsv(IList collection)
{
StringBuilder sb = new StringBuilder();
for (int index = 0; index < collection.Count; index++)
{
object item = collection[index];
if (index == 0)
{
sb.Append(ObjectToCsvHeader(item));
}
sb.Append(ObjectToCsvData(item));
sb.Append(Environment.NewLine);
}
return sb.ToString();
}
public static string ObjectToCsvData(object obj)
{
/*if (obj == null)
{
throw new ArgumentNullException("obj", "value is null");
}*/
StringBuilder sb = new StringBuilder();
Type t = obj.GetType();
PropertyInfo[] pi = t.GetProperties();
for (int index = 0; index < pi.Length; index++)
{
/*object oTest = pi[index].GetValue(obj, null);
string str = oTest.ToString();
sb.Append(str.CsvQuote());
*/
sb.Append(pi[index].GetValue(obj, null));
if (index < pi.Length - 1)
{
sb.Append(",");
}
}
return sb.ToString();
}
public static string ObjectToCsvHeader(object obj)
{
/*if (obj == null)
{
throw new ArgumentNullException("obj", "value is null!");
}*/
StringBuilder sb = new StringBuilder();
Type t = obj.GetType();
PropertyInfo[] pi = t.GetProperties();
for (int index = 0; index < pi.Length; index++)
{
sb.Append(pi[index].Name);
if (index < pi.Length - 1)
{
sb.Append(",");
}
}
sb.Append(Environment.NewLine);
return sb.ToString();
}
public static string CsvQuote(this string text)
{
if (text == null)
{
return string.Empty;
}
bool containsQuote = false;
bool containsComma = false;
int len = text.Length;
for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++)
{
char ch = text[i];
if (ch == '"')
{
containsQuote = true;
}
else if (ch == ',')
{
containsComma = true;
}
}
bool mustQuote = containsComma || containsQuote;
if (containsQuote)
{
text = text.Replace("\"", "\"\"");
}
if (mustQuote)
{
return "\"" + text + "\"";
}
else
{
return text;
}
}
}
}
簡單的測試:__if((VAL包含',')||(VAL包含' 「'))__渦卷值在'」'和逃逸的任何現有'「' (如''「') – 2014-12-01 21:46:35
1.問題在哪裏?2.不要編寫自己的CSV編寫器或解析器,這裏有_many_工作庫/ nugets – Mormegil 2014-12-01 21:48:08
您的containsQuote /逗號代碼可以替換爲'containsQuote = text.IndexOf(''')> = 0; containsComma = text.IndexOf(',')> = 0;'。 – 2014-12-01 21:55:37