【问题标题】:Splitting a string by \t - will successive tabs cause issues?通过 \t 拆分字符串 - 连续的制表符会导致问题吗?
【发布时间】:2011-07-14 21:59:38
【问题描述】:

我正在编写一个自动化程序来解析一个制表符分隔的文件并将数据写入另一个程序。目前,它采用文件的每一行,按制表符拆分,并在其命令中使用不同的条目。我的问题是,即使我正在解析的所有数据条目都应该有“X”个字段,但仍有很多字段是空的,有时有些选项卡会立即接替其他选项卡。

当我尝试从拆分文件行访问字符串列表时,我发现自己有时会经常收到IndexOutOfRangeException。多个选项卡是否会导致我的列表并不总是以“X”个字段结束,从而引发此异常?如果是这样,有没有办法解决这个问题?

[编辑] 代码如下:

string[] parts = line.Split('\t');
String Organization = parts[0];
String SalesRep_FirstName = SalesRep.Split(' ').First();
String SalesRep_LastName = SalesRep.Split(' ').Last();
String Opportunity = parts[1] == "" ? "" : parts[1];
String Type = parts[6] == "" ? comboBox1.SelectedItem.ToString() : parts[6];
String CloseMonth = (parts[5].Split('/'))[0] == "" ? "12" : (parts[5].Split('/'))[0];
String CloseDay = (parts[5].Split('/'))[1] == "" ? "21" : (parts[5].Split('/'))[1];
String CloseYear = (parts[5].Split('/'))[2] == "" ? "2012" : (parts[5].Split('/'))[2];
String Stage = (parts[2].Split('-'))[0] == "" ? "1" : (parts[2].Split('-'))[0];
String Probability = parts[4] == "" ? "0" : (Math.Round(decimal.Parse(parts[4]) / 10) * 10).ToString();
String Source = parts[7] == "" ? "" : parts[7];
String Department = Type;
String Product = Opportunity;
String Revenue = parts[3] == "" ? "" : parts[3];

理想情况下,parts 列表的每个实例将有 9 个条目,(parts[8] 是多余的,因此此处未引用)

【问题讨论】:

    标签: c# parsing


    【解决方案1】:

    您可以通过两种方式拆分字符串:

    string input = "x\t\ty\t\t\tz";
    
    char[] separator = new char[] { '\t' };
    
    string[] result1 = input.Split(separator, StringSplitOptions.None);
    // result1 == new string[] { "x", "", "y", "", "", "z" }
    
    string[] result2 = input.Split(separator, StringSplitOptions.RemoveEmptyEntries);
    // result2 == new string[] { "x", "y", "z" }
    

    如果您使用 StringSplitOptions.None,则结果数组应始终具有相同的长度 - 前提是每个输入包含相同数量的制表符。

    【讨论】:

      【解决方案2】:

      这应该不是问题,除非您使用的是StringSplitOptions.RemoveEmptyEntries

      例如:

      string text = "a\t\t\tb";
      string[] bits = text.Split('\t');
      Console.WriteLine(bits.Length); // 4, of which the middle two are empty
      

      如果您可以发布无效的代码(最好以简短但完整的形式),那将有所帮助。

      【讨论】:

      • @Jordan:好吧,你在那儿做了很多的分裂。例如,parts[5] 可能为空,导致CloseYear 不正确。基本上,我认为问题不在于按选项卡拆分...当异常发生时,您是否记录了您遇到问题的数据?
      • 有点。这是我的第一个 winforms 应用程序,我在学习过程中学到了很多东西。我正在做一些基本的日志记录,但我怀疑它是否会深入了解我的问题的细节。不过,我确实明白你所说的分裂是什么意思,所以我要看看
      猜你喜欢
      • 2011-11-09
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多