C# 拆下拖曳管-'|';在c中#

C# 拆下拖曳管-'|';在c中#,c#,C#,我有一个字符串,看起来像这样: "PID||000000|Z123345|23345|SOMEONE^FIRSTNAME^^^MISS^||150|F|1111||1 DREYFUS CLOSE^SOUTH CITY^COUNTY^^POST CODE^^^||0123 45678910^PRN^PH^^^^0123 45678910^^~^^CP^^^^^^~^NET^^^^^^^||||1A|||||A||||||||N||||||||||"; "PID||000000|Z123345|2

我有一个字符串,看起来像这样:

"PID||000000|Z123345|23345|SOMEONE^FIRSTNAME^^^MISS^||150|F|1111||1 DREYFUS CLOSE^SOUTH CITY^COUNTY^^POST CODE^^^||0123 45678910^PRN^PH^^^^0123 45678910^^~^^CP^^^^^^~^NET^^^^^^^||||1A|||||A||||||||N||||||||||";
"PID||000000|Z123345|23345|SOMEONE^FIRSTNAME^^^MISS^||150|F|1111||1 DREYFUS CLOSE^SOUTH CITY^COUNTY^^POST CODE^^^||0123 45678910^PRN^PH^^^^0123 45678910^^~^^CP^^^^^^~^NET^^^^^^^||||1A|||||A||||||||N";

我试图删除字符串中第30个“|”之后的任何分隔“|”字符,以便输出字符串如下所示:

"PID||000000|Z123345|23345|SOMEONE^FIRSTNAME^^^MISS^||150|F|1111||1 DREYFUS CLOSE^SOUTH CITY^COUNTY^^POST CODE^^^||0123 45678910^PRN^PH^^^^0123 45678910^^~^^CP^^^^^^~^NET^^^^^^^||||1A|||||A||||||||N||||||||||";
"PID||000000|Z123345|23345|SOMEONE^FIRSTNAME^^^MISS^||150|F|1111||1 DREYFUS CLOSE^SOUTH CITY^COUNTY^^POST CODE^^^||0123 45678910^PRN^PH^^^^0123 45678910^^~^^CP^^^^^^~^NET^^^^^^^||||1A|||||A||||||||N";
我正试图用尽可能少的代码来完成它,但运气不太好。任何帮助或想法都会很好。

你可以使用这种方法

string str = "PID||000000|Z123345|23345|SOMEONE^FIRSTNAME^^^MISS^||150|F|1111||1 DREYFUS CLOSE^SOUTH CITY^COUNTY^^POST CODE^^^||0123 45678910^PRN^PH^^^^0123 45678910^^~^^CP^^^^^^~^NET^^^^^^^||||1A|||||A||||||||N||||||||||";
int c = 0;
int after = 30;
StringBuilder newStr = new StringBuilder();
for(int i = 0;i < str.length; i++){
    if(str[i] == '|'){
        if(after != c){
             newStr.append(str[i]);
             c++;
        }
    }else{
        newStr.append(str[i]);
    }
}
如果您真正想要的是第30块之后的所有内容都失去了其“|”,那么请尝试:

var chunks = input.Split('|');
var output = String.Join('|',chunks.Take(30)) + String.Concat(chunks.Skip(30));
也就是说,我觉得听起来你真正想要的可能是:

var output = input.TrimEnd('|');

蛮力,但只有一点点代码:

  string s2 = string.Join("|", s1.Split('|').Take(31));

如果您需要对此类数据进行任何其他处理(它看起来像一种嵌套的CSV),那么知道
string.Split()
是很有用的。

正则表达式应该做到以下几点:

var regex = new Regex(@"^([^\|]*\|){0,30}[^\|]*");
var match = regex.Match(input);
if(match.Success)
{
    var val = match.Value;
}

“…在字符串中的第30个“|”之后…”我肯定会查看子字符串和循环(或while循环)。这些将对您非常有帮助。假设这是管道分隔的,您想要第31+个单元格吗?或者只是将它们连接到一个单元格中?你说的是第30个管道,是因为它碰巧是最后一个不是拖曳管道的管道,还是30是问题的重要部分?如果在N之前有更少的管道,还会有拖曳管道吗?如果N前面有30多个管道,您会删除它之前的管道吗?不确定它是否完全符合他的要求。但在30个小节之后?“删除字符串中30个“|”之后的任何分隔“|”字符”这到底是如何满足这一要求的?如果在第29栏之后没有更多的“正常”字符呢?或者第30栏之前的字段是空的呢?在对字符串执行此类操作时,您应该使用
StringBuilder
。我认为如果要求在30“|”之后,这是最好的解决方案之一。之前没有错误,只是您的代码用于创建大量临时字符串。使用StrinbBuilder优化了这一点。是的,我知道,我没有把它放到编译器或vs中,这就是我要说的xD@MariusBancila-对于少于100个子字符串,StringBuilder不是一个非常相关的优化。与其使用空分隔符连接
Join
,不如使用
String.Concat
@JeppeStigNielsen好建议,更新我的答案以反映。
var regex = new Regex(@"^([^\|]*\|){0,30}[^\|]*");
var match = regex.Match(input);
if(match.Success)
{
    var val = match.Value;
}