我正在尝试使用/t
字符拆分以下字符串。
string bounces = "BounceEmail\tBounceType\tBounceDate\tBounceDescription\r\nuiohouih@gmaipuohuiphil.comj\tHARD_BOUNCE\t2016-07-01
16:50:26\t\r\nuiohouih@gmaipuohuiphil.comj\tHARD_BOUNCE\t2016-07-01
16:50:26\t"
但令我惊讶的是,以下命令不起作用,我得到一个只有一个元素的数组,它是上面相同的字符串:
string[] columns = bounces.Split('\t');
更新:以下是将CSV文件内容转换为DataTable
public static DataTable GetCsvStringAsDataTable(string csvContent, char delimeter)
{
DataTable dt = new DataTable();
List<string> lines = new List<string>();
try
{
string[] linesArr = csvContent.Split(Environment.NewLine.ToCharArray());
foreach (var line in linesArr)
lines.Add(line);
if (lines.Count == 0)
return null;
string headerLine = lines[0];
string[] columns = headerLine.Split(delimeter);
lines.RemoveAt(0);
for (int col = 0; col < columns.Length; col++)
dt.Columns.Add(columns[col].Trim());
foreach (var line in lines)
{
var cols = line.Split(delimeter);
DataRow dr = dt.NewRow();
for (int cIndex = 0; cIndex < cols.Length; cIndex++)
dr[cIndex] = cols[cIndex].Trim();
dt.Rows.Add(dr);
}
return dt;
}
catch (Exception ex)
{
Log.Error(ex.Message);
return null;
}
}
更新2 :这是我从API收到的输入字符串。
答案 0 :(得分:1)
我冒昧地改善了你的功能 我的版本接受col分隔符和行分隔符:
public static DataTable GetCsvStringAsDataTable(string csvContent, char[] rowDelimeter, char[] colDelemiter)
{
try
{
var lines = csvContent.Split(rowDelimeter, StringSplitOptions.RemoveEmptyEntries);
if (lines.Length == 0)
{
return null;
}
var header = lines[0];
var columns = header.Split(colDelemiter, StringSplitOptions.RemoveEmptyEntries);
var dt = new DataTable();
foreach (var column in columns)
{
dt.Columns.Add(column);
}
foreach (var line in lines.Skip(1))
{
var cols = line.Split(colDelemiter, StringSplitOptions.RemoveEmptyEntries);
dt.Rows.Add(cols);
}
return dt;
}
catch (Exception ex)
{
Log.Error(ex.Message);
return null;
}
}
你这样使用它:
var rowDelimeter = new char[] { '\r', '\n' };
var colDelemiter = new char[] { '\t' };
var dt = GetCsvStringAsDataTable(bounces, rowDelimeter, colDelemiter);