【问题标题】:C# - String.Split() Remove last itemC# - String.Split() 删除最后一项
【发布时间】:2011-07-25 22:41:52
【问题描述】:

我有一个加载了如下文件的 RTB:

J6      INT-00113G  227.905  174.994  180  SOIC8    
J3      INT-00113G  227.905  203.244  180  SOIC8     
U13     EXCLUDES    242.210  181.294  180  QFP128    
U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    

我想使用 string.Split() 方法删除最后一列。

到目前为止我有:

// Splits the lines in the rich text boxes
string[] lines = richTextBox2.Text.Split('\n');

foreach (var newLine in lines)
{
     newLine.Split(' ');
     line = line[0] + line[1] + line[2] + line[3] + line[4];  #This is the code that does not work.
}

但是这不起作用...有谁知道问题以及如何正确执行此操作以使文件看起来像这样?:

J6      INT-00113G  227.905  174.994  180      
J3      INT-00113G  227.905  203.244  180       
U13     EXCLUDES    242.210  181.294  180     
U3      IC-00276G   236.135  198.644  90      
U12     IC-00270G   250.610  201.594  0         
J1      INT-00112G  269.665  179.894  180     
J2      INT-00112G  269.665  198.144  180    

编辑:我还认为我需要string.Split(' ') 已经拆分的每一行?

【问题讨论】:

  • 这显然行不通。你不能把一个字符串数组变成一个字符串。
  • @BoltClock:我该如何解决这个问题?

标签: c# list split concat


【解决方案1】:

这可能有效(未经测试):

string[] lines = richTextBox2.Text.Split('\n');
for( int i = 0; i < lines.Length; i ++ )
{
    lines[i] = lines[i].Trim(); //remove white space
    lines[i] = lines[i].substring(0, lines[i].LastIndexOf(' ');
}
string masterLine = String.Join(Environment.NewLine, lines);

【讨论】:

  • 这是最好的解决方案,因为它不依赖于知道要拆分的字符 - 例如某些解决方案中使用的 41 或 43
  • @iandotkelly:根据所述原因,您在声明这是“最佳”解决方案时做出了一些假设。只有 OP 知道确切地他想要什么行为。例如,假设文件格式可能会更改,从而添加了另一列,并且他希望也忽略该列。然后 this 解决方案将不再有效,但固定宽度截止方法仍然有效。当然,也可以很容易地编造出说明相反情况的场景。这完全取决于目标到底是什么。
  • @Mannimarco:这是我需要的! Dan Tao +1 对 OP 的正确认识,知道需要什么。
  • @Dan Tao:关于专栏是真的。以这种方式删除两列会很痛苦。我只是讨厌数字符=p
  • @Colton:在这种情况下,您会有一些行中没有空格字符。所以上面的解决方案仍然不能工作;在这种情况下,它只会给你一个空行。您的列是否可以用制表符而不是空格分隔?如果是这样,您可以尝试 LastIndexOfAny' '\t
【解决方案2】:

这是一个固定宽度的布局,所以你只要把第五列右边的所有内容都剪掉就可以完成你想要的:

string[] lines = File.ReadAllLines(path);
for (int i = 0; i < lines.Length; ++i)
{
    lines[i] = lines[i].Substring(0, 43);
}

示例输入文件:

J6      INT-00113G  227.905  174.994  180  SOIC8    
J3      INT-00113G  227.905  203.244  180  SOIC8     
U13     EXCLUDES    242.210  181.294  180  QFP128    
U3      IC-00276G   236.135  198.644  90   BGA48     
U12     IC-00270G   250.610  201.594  0    SOP8      
J1      INT-00112G  269.665  179.894  180  SOIC16    
J2      INT-00112G  269.665  198.144  180  SOIC16    

输出:

J6      INT-00113G  227.905  174.994  180  
J3      INT-00113G  227.905  203.244  180  
U13     EXCLUDES    242.210  181.294  180  
U3      IC-00276G   236.135  198.644  90   
U12     IC-00270G   250.610  201.594  0    
J1      INT-00112G  269.665  179.894  180  
J2      INT-00112G  269.665  198.144  180  

【讨论】:

  • 如果不是固定宽度,我该怎么办?
  • @Colton: Mannimarco's answer 在这种情况下应该可以帮助您。 (但是,如果它不是固定宽度的布局,那你为什么要给我们提供虚构的输入?)
  • 这可行,但不能保证不固定的宽度。不过谢谢。
【解决方案3】:

你不是说 什么 不起作用..使用 Lines 属性你可以做这样的事情:

richTextBox2.Lines = richTextBox2.Lines
                                 .Select( l => string.Join(" ", l.Split(' ')
                                                     .Take(5)))
                                 .ToArray();

这当然只有在空格only作为列之间的分隔符出现时才有效。

【讨论】:

    【解决方案4】:

    这些相当容易阅读......

            string data = "J6      INT-00113G  227.905  174.994  180  SOIC8\r\nJ3      INT-00113G  227.905  203.244  180  SOIC8\r\nU13     EXCLUDES    242.210  181.294  180  QFP128\r\nU3      IC-00276G   236.135  198.644  90   BGA48\r\nU12     IC-00270G   250.610  201.594  0    SOP8\r\nJ1      INT-00112G  269.665  179.894  180  SOIC16\r\nJ2      INT-00112G  269.665  198.144  180  SOIC16\r\n";
    
            // Split on new line
            string[] lines = data.Split(new string[] {"\r\n"}, int.MaxValue, StringSplitOptions.RemoveEmptyEntries);
    
            StringBuilder result = new StringBuilder();
    
            foreach (string line in lines)
            {
                // Find the last space in the line
                int lastSpace = line.LastIndexOf(' ');
    
                // delete the end of the string from the last space
                string newLine = line.Remove(lastSpace);
    
                // rebuild string using stringBuilder
                result.AppendLine(newLine);
            }
    
            Console.WriteLine("Old List:");
            Console.Write(data);
    
            Console.WriteLine("New List:");
            Console.Write(result);
        }
    

    这个大概接近O(n):

            StringBuilder result = new StringBuilder();
            string data = "J6      INT-00113G  227.905  174.994  180  SOIC8\r\nJ3      INT-00113G  227.905  203.244  180  SOIC8\r\nU13     EXCLUDES    242.210  181.294  180  QFP128\r\nU3      IC-00276G   236.135  198.644  90   BGA48\r\nU12     IC-00270G   250.610  201.594  0    SOP8\r\nJ1      INT-00112G  269.665  179.894  180  SOIC16\r\nJ2      INT-00112G  269.665  198.144  180  SOIC16\r\n";
    
            // Split on new line
            int startchar = 0;
            int lastspace = 0;
    
            for(int i = 0; i < data.Length - 1; i++)
            {
                char current = data[i];
    
                if (current == ' ')
                {
                    // remember last space
                    lastspace = i;
                }
                else if (current == '\n')
                {
                    result.AppendLine(data.Substring(startchar, lastspace - startchar));
    
                    if(i != data.Length - 1)
                    {
                        startchar = i + 1;
                        lastspace = startchar;
                    }
                }
            }
    
    
            Console.Write(result.ToString());
    

    【讨论】:

      【解决方案5】:

      你是唯一一个“知道问题”的人。不幸的是,你决定不告诉我们它是什么。 (奇怪。)

      我要做的是按您的原样解析每一行,然后使用LastIndexOf() 找到最后一个空格,然后修剪那里的字符串。或者,您可以将结果传递给 Trim() 以删除任何尾随空格。

      【讨论】:

      • 现在我查看了我发布的代码,我正在拆分字符串中的每一行。所以每个字符串看起来都类似于:J1 INT-00112G 269.665 179.894 180 SOIC16。但是,我需要将该行拆分为 .Split(' ') 之类的内容,以便将其拆分为空格以获取新字符串。我将在上面发布更新的代码...但我几乎做不到:line[0] + line[1]...;跨度>
      【解决方案6】:

      假设你的线条总是相同的宽度:

      string parsed = richTextBox2.Text.Split('\n').
               Select(l => l.Substring(41) + Environment.NewLine);
      

      【讨论】:

        【解决方案7】:

        您可能应该首先使用 readline() 逐行读取文件,然后使用 split 拆分每一行。

        【讨论】:

          【解决方案8】:
          var myString = "I want to remove the last item";
          var mySplitResult = myString.split(" ");
          var lastitem =  mySplitResult[mySplitResult.length-1] 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-01
            相关资源
            最近更新 更多