如何将带有“\r\n”的字符串转换为列表?
How to convert string with some "\r\n" into list?
我有一个字符串,想将其转换为 LinkedList
,这样每一行都是一个元素。
我用的是Visual Studio2012.
有什么简单的方法吗?
这个字符串看起来像:
LOAD =5.01E+10
MPY
ADD
但实际上它包含LOAD =5.01E+10\r\nMPY \r\nADD
重要更新:我不需要删除“\r\n”或类似的内容。我需要在每个元素中包含一对 "left part" 和 "right part" 的列表(实际上没有链接)。我从前面的例子中得到什么样的列表的例子:
("LOAD ", "=5.01E+10") => ("MPY ", "") => ("ADD ", "") => null
实际上,最好在剩下的部分之后免费保存所有这些 space。
是的,
yourString = yourString.Replace(System.Environment.NewLine, "\r\n");
这是输出
string LOAD = "5.01E+10\r\nMPY \r\nADD ";
string newstring1 = LOAD.Replace("\r", " ");
string newstring2 = newstring1.Replace("\n", " ");
Console.WriteLine(newstring2);
输出
5.01E+10 MPY ADD
换行符的表示方式取决于环境:Linux 例如使用 \n
.
为了简化操作,您可以使用 StringReader
:
public static IEnumerable<string> Lines (string text) {
string line;
using (StringReader reader = new StringReader(text)) {
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
对于行的惰性评估:如果您有一个巨大的文件,并且只需要向用户显示前 10 行,这在将来会很有帮助。
然后调用:
return new LinkedList<string>(Lines(text));
编辑:
获取pairs,可以引入新的方法:
然后可以使用第二种方法将项目拆分成对:
public static KeyValuePair<string,string> SplitToKeyValue(string text) {
Regex p = new Regex(@"^(\w+)\s+(.*)$");
Match m = p.Match(text);
return new KeyValuePair<string,string>(m.Groups[1].Value,m.Groups[2].Value);
}
然后创建LinkedList
:
return new LinkedList<KeyValuePair<string,string>>(Lines(text).Select(SplitToKeyValue));
演示版
使用 Mono 的 csharp
交互式 shell:
$ csharp
Mono C# Shell, type "help;" for help
Enter statements below.
csharp> using System.IO;
csharp> using System.Text.RegularExpressions;
csharp> public static class Foo {
>
> public static KeyValuePair<string,string> SplitToKeyValue(string text) {
> Regex p = new Regex(@"^(\w+)\s+(.*)$");
> Match m = p.Match(text);
> return new KeyValuePair<string,string>(m.Groups[1].Value,m.Groups[2].Value);
> }
>
> public static IEnumerable<string> Lines (string text) {
> string line;
> using (StringReader reader = new StringReader(text)) {
> while ((line = reader.ReadLine()) != null) {
> yield return line;
> }
> }
> }
>
> }
csharp> string inp = "LOAD =5.01E+10\nMPY \nADD ";
csharp> new LinkedList<KeyValuePair<string,string>>(Foo.Lines(inp).Select(Foo.SplitToKeyValue))
{ [LOAD, =5.01E+10], [MPY, ], [ADD, ] }
或fiddle.
我知道您需要将字符串转换为列表。如果正确,那么解决方案是
Regex.Matches("your string","\r\n", RegexOptions.Singleline|RegexOptions.IgnoreCase)
所以根据你的问题,我知道你需要将这个字符串转换成一个链表——键值对。这是一种方法:
编辑(抱歉这个问题有太多的编辑):
string input = "LOAD =5.01E+10\r\nMPY \r\nADD ";
IEnumerable<KeyValuePair<string, string>> pairs =
input.Split(new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries))
.Select(x => new KeyValuePair<string, string>(x[0], x[1]));
var data = new LinkedList<KeyValuePair<string, string>>(pairs);
编辑
下面是如何遍历链表:
foreach (KeyValuePair<string, string> pair in data) {
Console.WriteLine("Key: {0} - Value: {1}", pair.Key, pair.Value);
}
或者获取一个节点并访问它的Value
,也就是键值对:
KeyValuePair<string, string> p = data.First.Value;
string k = p.Key; // LOAD
string v = p.Value; // =5.01E+10
我有一个字符串,想将其转换为 LinkedList
,这样每一行都是一个元素。
我用的是Visual Studio2012.
有什么简单的方法吗?
这个字符串看起来像:
LOAD =5.01E+10
MPY
ADD
但实际上它包含LOAD =5.01E+10\r\nMPY \r\nADD
重要更新:我不需要删除“\r\n”或类似的内容。我需要在每个元素中包含一对 "left part" 和 "right part" 的列表(实际上没有链接)。我从前面的例子中得到什么样的列表的例子:
("LOAD ", "=5.01E+10") => ("MPY ", "") => ("ADD ", "") => null
实际上,最好在剩下的部分之后免费保存所有这些 space。
是的,
yourString = yourString.Replace(System.Environment.NewLine, "\r\n");
这是输出
string LOAD = "5.01E+10\r\nMPY \r\nADD ";
string newstring1 = LOAD.Replace("\r", " ");
string newstring2 = newstring1.Replace("\n", " ");
Console.WriteLine(newstring2);
输出
5.01E+10 MPY ADD
换行符的表示方式取决于环境:Linux 例如使用 \n
.
为了简化操作,您可以使用 StringReader
:
public static IEnumerable<string> Lines (string text) {
string line;
using (StringReader reader = new StringReader(text)) {
while ((line = reader.ReadLine()) != null) {
yield return line;
}
}
}
对于行的惰性评估:如果您有一个巨大的文件,并且只需要向用户显示前 10 行,这在将来会很有帮助。
然后调用:
return new LinkedList<string>(Lines(text));
编辑:
获取pairs,可以引入新的方法:
然后可以使用第二种方法将项目拆分成对:
public static KeyValuePair<string,string> SplitToKeyValue(string text) {
Regex p = new Regex(@"^(\w+)\s+(.*)$");
Match m = p.Match(text);
return new KeyValuePair<string,string>(m.Groups[1].Value,m.Groups[2].Value);
}
然后创建LinkedList
:
return new LinkedList<KeyValuePair<string,string>>(Lines(text).Select(SplitToKeyValue));
演示版
使用 Mono 的 csharp
交互式 shell:
$ csharp
Mono C# Shell, type "help;" for help
Enter statements below.
csharp> using System.IO;
csharp> using System.Text.RegularExpressions;
csharp> public static class Foo {
>
> public static KeyValuePair<string,string> SplitToKeyValue(string text) {
> Regex p = new Regex(@"^(\w+)\s+(.*)$");
> Match m = p.Match(text);
> return new KeyValuePair<string,string>(m.Groups[1].Value,m.Groups[2].Value);
> }
>
> public static IEnumerable<string> Lines (string text) {
> string line;
> using (StringReader reader = new StringReader(text)) {
> while ((line = reader.ReadLine()) != null) {
> yield return line;
> }
> }
> }
>
> }
csharp> string inp = "LOAD =5.01E+10\nMPY \nADD ";
csharp> new LinkedList<KeyValuePair<string,string>>(Foo.Lines(inp).Select(Foo.SplitToKeyValue))
{ [LOAD, =5.01E+10], [MPY, ], [ADD, ] }
或fiddle.
我知道您需要将字符串转换为列表。如果正确,那么解决方案是
Regex.Matches("your string","\r\n", RegexOptions.Singleline|RegexOptions.IgnoreCase)
所以根据你的问题,我知道你需要将这个字符串转换成一个链表——键值对。这是一种方法:
编辑(抱歉这个问题有太多的编辑):
string input = "LOAD =5.01E+10\r\nMPY \r\nADD ";
IEnumerable<KeyValuePair<string, string>> pairs =
input.Split(new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries))
.Select(x => new KeyValuePair<string, string>(x[0], x[1]));
var data = new LinkedList<KeyValuePair<string, string>>(pairs);
编辑
下面是如何遍历链表:
foreach (KeyValuePair<string, string> pair in data) {
Console.WriteLine("Key: {0} - Value: {1}", pair.Key, pair.Value);
}
或者获取一个节点并访问它的Value
,也就是键值对:
KeyValuePair<string, string> p = data.First.Value;
string k = p.Key; // LOAD
string v = p.Value; // =5.01E+10