C# - String.Split() 删除最后一个元素

3

我有一个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
@BoltClock:我该如何解决这个问题? - theNoobGuy
8个回答

7
这可能有效(未经测试):
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);

1
@iandotkelly:你在宣称这是“最佳”解决方案时,基于所述原因做出了一些假设。只有 OP 知道他想要的行为确切是什么。例如,假设文件格式可能会更改,添加另一列并且他也希望忽略该列。那么解决方案将不再起作用,但固定宽度截断方法仍然有效。当然,也可以轻松地构思相反情况的场景。这完全取决于目标是什么。 - Dan Tao
@Dan Tao:关于列的问题是正确的。这样删除两列会很麻烦。我只是讨厌数字符号 =p - Coeffect
@iandotkelly:好吧,现在这个问题已经没有意义了;原帖作者已经说明该格式不能保证是固定宽度,因此这对他来说是适当的解决方案!话虽如此,我认为重要的一点是,在面对所描述的问题时,开发人员应该首先确定关于输入数据可以做出哪些有效的假设(即与业务、客户、数据供应商或其他人)然后才能最终确定解决方案。否则,我们只能猜测什么更可能或不太可能。 - Dan Tao
@Dan Tao:同意。@Mannimarco:我通过将你的代码替换为 lines[i] = lines[i].substring(0, lines[i].LastIndexOf(' ') + 1); 来修复了一个错误。 - theNoobGuy
1
@Colton:在这种情况下,您的某些行中没有空格字符。因此,上面的解决方案仍然无法工作;在这种情况下,它只会给您一个空白行。您的列是否使用制表符而不是空格分隔?如果是这样,您可以尝试使用LastIndexOfAny' '\t - Dan Tao
显示剩余6条评论

3

这是一个固定宽度的布局,所以您只需将第五列右侧的所有内容剪切掉即可实现您想要的效果:

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  

如果它不是固定宽度,我该怎么做? - theNoobGuy
@Colton:Mannimarco的答案应该能帮助您解决这个问题。(不过,如果它不是固定宽度布局,那么为什么提供虚构输入呢?) - Dan Tao
这个可以工作,但对于宽度不固定的情况不能保证。不过还是谢谢你。 - theNoobGuy

1

您没有说出哪里出了问题。使用Lines属性,您可以像这样做:

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

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


1

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

        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());

0
var myString = "I want to remove the last item";
var mySplitResult = myString.split(" ");
var lastitem =  mySplitResult[mySplitResult.length-1] 

0

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

我会像你一样解析每一行,然后使用LastIndexOf()找到最后一个空格,并在那里修剪字符串。可选地,你可以将结果传递给Trim()以删除任何尾随空格。


现在我查看我发布的代码,我正在分割字符串中的每一行。因此,每个字符串将类似于这样:J1 INT-00112G 269.665 179.894 180 SOIC16。然而,我需要按.Split(' ')这样的方式拆分该行,以便通过空格进行拆分以获取新字符串。我将在上面发布更新后的代码...但基本上我不能这样做:line[0] + line[1]...; - theNoobGuy

0

假设你的行宽总是相同的:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接