我从文件中读取字符串,它们有各种风格:
item0 item1 item2
item0,item1,item2
item0_item1_item2
我将它们拆分成这样:
string[] split_line = line[i].split(new char[] {' ',',','_'});
我更改了一个项目(列),然后使用字符串生成器将字符串拼接回来。 但现在当把字符串放回去时我必须使用正确的分隔符。
分割字符串时是否可以知道使用了哪个分隔符?
的更新 的 调用者会将第一个项目传给我,以便我只更改该行。
答案 0 :(得分:3)
除非你跟踪分裂行动(当时只有一个),否则你不会。 否则,您可以创建一个正则表达式,以捕获项目和分隔符并从那里开始。
答案 1 :(得分:0)
正如我所提到的那样,来电者将第一项传给了我,所以我尝试了这样的事情:
// find the right row
if (lines[i].ToLower().StartsWith(rowID))
{
// we have to know which delim was used to split the string since this will be
// used when stitching back the string together.
for (int delim = 0; delim < delims.Length; delim++)
{
// we split the line into an array and then use the array index as our column index
split_line = lines[i].Trim().Split(delims[delim]);
// we found the right delim
if (split_line.Length > 1)
{
delim_used = delims[delim];
break;
}
}
}
基本上我迭代delims上的每一行并检查结果数组的长度。如果是> 1表示delim工作否则跳到下一个。我正在使用拆分函数属性“If this instance does not contain any of the characters in separator, the returned array consists of a single element that contains this instance.
”
答案 2 :(得分:0)
您可以使用正则表达式来分割字符串,而不是传入一个字符数组。这样做的好处是可以捕获分裂字符。 Regex.Split将在数组中的元素之间插入任何捕获,如下所示:
string[] space = Regex.Split("123 456 789", @"([,_ ])");
// Results in { "123", " ", "456", " ", "789" }
string[] comma = Regex.Split("123,456,789", @"([,_ ])");
// Results in { "123", ",", "456", ",", "789" }
string[] underscore = Regex.Split("123_456_789", @"([,_ ])");
// Results in { "123", "_", "456", "_", "789" }
然后,您可以使用类似
的内容编辑数组中的所有项目for (int x = 0; x < space.Length; x += 2)
space[x] = space[x] + "x";
Console.WriteLine(String.Join("", space));
// Will print: 123x 456x 789x
在处理多个分隔符时要注意的一件事是,是否有任何行中包含空格,逗号和下划线。例如
37,hello world,238_3
此代码将保留所有不同的分隔符,但可能不会出现结果。例如以上的输出将是:
37x,hellox worldx,238x_3x