【发布时间】:2016-07-04 16:44:40
【问题描述】:
我正在尝试使用/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;
}
}
UPDATE 2:这是我从 API 收到的输入字符串。
【问题讨论】:
-
您在此处提供的代码确实有效。您是否从文件中加载字符串?它真正包含什么?
-
在输入数据中有 \r\n 时,在 Environment.NewLine.ToCharArray 上拆分会产生空字符串。但是,添加 StringSplitOptions.RemoveEmptyEntries 会产生一个 DataTable,其中恰好有两行 4 列,正如输入数据所期望的那样
-
我建议使用十六进制查看器查看输入数据,并检查 \t 是否以 0x09 值存在,而不是两个单独的字符 \ 和 t
-
与流行的看法相反,并不总是推荐使用
Environment.NewLine。您需要知道真正的分隔符是什么,然后根据实际存在的分隔符进行拆分。快速修复是lines = text.Replace("\r\n", "\r").Replace(\r","\n").Split('\n'); -
起初我得到了与海报相同的结果,1 个元素数组 - 当使用
@为字符串变量添加前缀时。在删除它时,我得到了所有元素。但是海报无论如何都没有用@定义它的字符串......