【问题标题】:Split not working with TAB character [closed]拆分不适用于 TAB 字符[关闭]
【发布时间】: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 个元素数组 - 当使用 @ 为字符串变量添加前缀时。在删除它时,我得到了所有元素。但是海报无论如何都没有用@定义它的字符串......

标签: c# string split


【解决方案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);

【讨论】:

  • 谢谢。但我仍然只收到一个元素,它是整个输入字符串。
  • @Steve Good catch!,它基本上只是一个稍作修改的复制粘贴,所以我没听懂。
  • 当然。谢谢。一旦我解决了主要问题,就会替换你的改进版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
相关资源
最近更新 更多