File 拆分以不同行分隔信息的文本文件
因此,我有一个文本文件,其中的信息由enter键分隔(我不知道如何解释,我将粘贴代码和一些东西) 下面是文本文件的外观,我需要将其分为三部分,第一部分是舞蹈类型,然后是舞者1和舞者2File 拆分以不同行分隔信息的文本文件,file,text,split,File,Text,Split,因此,我有一个文本文件,其中的信息由enter键分隔(我不知道如何解释,我将粘贴代码和一些东西) 下面是文本文件的外观,我需要将其分为三部分,第一部分是舞蹈类型,然后是舞者1和舞者2 using System; using System.Collections.Generic; using System.IO; namespace tanciskola { struct tanc { public string tancnev; public s
using System;
using System.Collections.Generic;
using System.IO;
namespace tanciskola
{
struct tanc
{
public string tancnev;
public string tancos1;
public string tancos2;
}
class Program
{
static void Main(string[] args)
{
#region 1.feladat
StreamReader sr = new StreamReader("tancrend.txt");
tanc[] tanc = new tanc[140];
string[] elv;
int i = 0;
while (sr.Peek() != 0)
{
elv = sr.ReadLine().Split('I don't know what goes here');
tanc[i].tancnev = elv[0];
tanc[i].tancos1 = elv[1];
tanc[i].tancos2 = elv[2];
i++;
}
#endregion
Console.ReadKey();
}
}
}
下面是我如何试图解决它的,虽然我真的不知道我应该怎么做。任务是显示第一个舞蹈和最后一个舞蹈,但为此,我需要以某种方式拆分它。要按“输入字符”拆分,可以使用.NET中的Environment.NewLine:
这个常量将包含特定于操作系统(我猜是Windows)的序列
您应该知道,对于Windows和Linux/Unix,用于换行符的字符是不同的。因此,在极少数情况下,有人在不同的操作系统上编辑您的文件,您可能会遇到问题
在Windows上,换行符是两个字符的序列:回车+换行符(ASCII 13+10)。在Linux上,它只是换行。所以,如果你想变得更聪明,你可以先检查CRLF,如果你只从Split()中得到一个元素,然后再尝试LF。正如我在评论中提到的,你似乎有一个文本文件,其中每个项目都在一个新行上,一组3行组成一个“记录”。在这种情况下,您只需读取文件的所有行,然后创建记录,如下所示:
var v = File.ReadLines("file path");
tancr[] tanc = new tancr[140];
for (int i = 0; i < v.Count(); i += 3)
{
tanc[i/3].tancnev= v.ElementAt(i);
tanc[i/3].tancos1 = v.ElementAt(i + 1);
tanc[i/3].tancos2 = v.ElementAt(i + 2);
}
var v=File.ReadLines(“文件路径”);
tancr[]tanc=新的tancr[140];
对于(int i=0;i
注意:
ReadLines()
在文件大小较大时更好。如果您的文件很小,您可以使用ReadAllLines()
。所以模式是dance,dancer1,dancer2,然后重复每个3行集合?如果是这样的话,你根本不需要分开。把所有的线都绕过去,这会给我两个错误。“string.Split(params char[])”的最佳重载方法匹配的参数“1”有一些无效的参数:无法从“string”转换为“char[]”我不知道为什么它不起作用。好吧,我做了(“\r”,“\n”),它似乎接受了它。新错误出现在tanc[i]行中。tancos1=elv[1];IndexOutOfRangeException未处理。索引超出了数组的界限。对不起,我已经更正了下面回答中的语法。String.Split()实际上比VB.NET的Split()稍微复杂一些,在VB.NET的Split()中,可以传入字符串。默认情况下,String.Split需要一个不同的单字符分隔符数组。我们想要的是一个单一的多字符(即字符串)分隔符,这是更复杂的重载给我们的。仍然给我相同的错误。可能还有另一种方式我没有考虑,因为这应该是一项简单的任务。是的,我想时间已经晚了,因为我在这个明显的问题上发呆了。您一次读取一行文件,这意味着您的字符串中永远不会有换行符。这就是为什么会出现IndexOutfrange异常。我已经调整了答案,一次阅读所有文本,但另一张海报是对的,逐行处理不需要拆分。我将答案留给后代,但这将是我建议的解决方案。尤其是文件更大的时候。好的,这几乎可以用了。但是我如何显示它们?如果我写Console.WriteLine(“{0}”,tanc[0].tancnev);它没有让我跳第一支舞。它到底是如何工作的?它显示了什么?循环从文件读取的行集合中读取,分配给变量,然后将计数器增加3,以读取下一组3行,即下一个记录编辑的答案。应为i/3
,以前进到下一个数组索引<代码>i%3将始终为0。我的错!
elv = sr.ReadAllText().Split(new string[] {Environment.NewLine}, StringSplitOptions.None);
var v = File.ReadLines("file path");
tancr[] tanc = new tancr[140];
for (int i = 0; i < v.Count(); i += 3)
{
tanc[i/3].tancnev= v.ElementAt(i);
tanc[i/3].tancos1 = v.ElementAt(i + 1);
tanc[i/3].tancos2 = v.ElementAt(i + 2);
}