C# ReadLine的替代方案?

C# ReadLine的替代方案?,c#,streamreader,readline,C#,Streamreader,Readline,我试图用ReadLine读取一些文件,但是我的文件有一些需要捕捉的换行符(不是全部),我不知道如何将它们放在同一个数组中,也不知道如何将它们放在具有这些分隔符的任何其他数组中。。。因为读取行读取行,然后打断这些行,嗯 我不能替换这些,因为我需要在处理后进行检查,所以我需要获取特征线和之后的内容。这就是问题所在。我该怎么做 这是我的密码: public class ReadFile { string extension; string filename; System.IO

我试图用
ReadLine
读取一些文件,但是我的文件有一些需要捕捉的换行符(不是全部),我不知道如何将它们放在同一个数组中,也不知道如何将它们放在具有这些分隔符的任何其他数组中。。。因为<代码>读取行读取行,然后打断这些行,嗯

我不能替换这些,因为我需要在处理后进行检查,所以我需要获取特征线和之后的内容。这就是问题所在。我该怎么做

这是我的密码:

public class ReadFile
{
    string extension;
    string filename;
    System.IO.StreamReader sr;

    public ReadFile(string arquivo, System.IO.StreamReader sr)
    {
        string ext = Path.GetExtension(arquivo);

        sr = new StreamReader(arquivo, System.Text.Encoding.Default);

        this.sr = sr;
        this.extension = ext;
        this.filename = Path.GetFileNameWithoutExtension(arquivo);

        if (ext.Equals(".EXP", StringComparison.OrdinalIgnoreCase))
        {
            ReadEXP(arquivo);
        }
        else MessageBox.Show("Extensão de arquivo não suportada: "+ext);

    }

    public void ReadEXP(string arquivo)
    {

        string line = sr.ReadLine();

        string[] words;
        string[] Separators = new string[] { "<Segment>", "</Segment>", "<Source>", "</Source>", "<Target>", "</Target>" };

        string ID = null;
        string Source = null;
        string Target = null;

        DataBase db = new DataBase();
        //db.CreateTable_EXP(filename);
        db.CreateTable_EXP();

        while ((line = sr.ReadLine()) != null)
        {

            try
            {

                if (line.Contains("<Segment>"))
                {
                    ID = "";
                    words = line.Split(Separators, StringSplitOptions.None);
                    ID = words[0];
                    for (int i = 1; i < words.Length; i++ )
                        ID += words[i];
                    MessageBox.Show("Segment[" + words.Length + "]: " + ID);
                }
                if (line.Contains("<Source>"))
                {
                    Source = "";
                    words = line.Split(Separators, StringSplitOptions.None);
                    Source = words[0];
                    for (int i = 1; i < words.Length; i++)
                        Source += words[i];
                    MessageBox.Show("Source[" + words.Length + "]: " + Source);
                }
                if (line.Contains("<Target>"))
                {
                    Target = "";
                    words = line.Split(Separators, StringSplitOptions.None);
                    Target = words[0];
                    for (int i = 1; i < words.Length; i++)
                        Target += words[i];
                    MessageBox.Show("Target[" + words.Length + "]: " + Target);

                    db.PopulateTable_EXP(ID, Source, Target);

                    MessageBox.Show("ID: " + ID + "\nSource: " + Source + "\nTarget: " + Target);
                }

            }
            catch (IndexOutOfRangeException e)
            {
                MessageBox.Show(e.Message.ToString());
                MessageBox.Show("ID: " + ID + "\nSource: " + Source + "\nTarget: " + Target);
            }

        }

        return;
    }
公共类读取文件
{
字符串扩展;
字符串文件名;
System.IO.StreamReader sr;
公共读取文件(字符串arquivo,System.IO.StreamReader sr)
{
字符串ext=Path.GetExtension(arquivo);
sr=新的StreamReader(arquivo,System.Text.Encoding.Default);
this.sr=sr;
this.extension=ext;
this.filename=Path.GetFileNameWithoutExtension(arquivo);
if(ext.Equals(“.EXP”,StringComparison.OrdinalIgnoreCase))
{
ReadEXP(arquivo);
}
else MessageBox.Show(“扩展arquivo não suportada:”+ext);
}
公共void ReadEXP(字符串arquivo)
{
字符串行=sr.ReadLine();
字符串[]个单词;
字符串[]分隔符=新字符串[]{“”、“”、“”、“”、“”、“”、“”、“”};
字符串ID=null;
字符串源=null;
字符串目标=null;
数据库db=新数据库();
//db.CreateTable_EXP(文件名);
db.CreateTable_EXP();
而((line=sr.ReadLine())!=null)
{
尝试
{
如果(第行包含(“”))
{
ID=“”;
words=line.Split(分隔符、StringSplitOptions.None);
ID=单词[0];
for(int i=1;i
如果您试图读取XML,请尝试使用内置库,下面是一个加载包含
的XML部分的简单示例

var xmlData = XDocument.Load(@"C:\folder\file.xml").Element("TopLevelTag");
if (xmlData == null) throw new Exception("Failed To Load XML");
下面是一种获取内容的简洁方法,如果XML中缺少内容,它不会抛出异常

var xmlBit = (string)xmlData.Element("SomeSubTag") ?? "";
如果你真的需要自己动手,那么看看CSV解析器的例子, 其中ReadBlock可用于获取原始数据,包括换行符

private char[] chunkBuffer = new char[4096];
var fileStream = new System.IO.StreamReader(new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
var chunkLength = fileStream.ReadBlock(chunkBuffer, 0, chunkBuffer.Length);

如果您读取XML文件,请使用专门的XML读取器(例如,使用
XDocument
).Nico的注释次数为1000次。不要尝试进行自己的XML解析。困难的方法是:使用ReadLine,但将字符串放入缓冲区。编写代码检查缓冲区,以确定是否拥有处理当前标记所需的所有内容。如果没有,则继续执行ReadLine并添加到缓冲区,直到找到结束标记。请显示y的示例ou输入和预期的位置,您希望一次读取多行内容。如果是XML,请关闭问题并按照@NicoSchertler的建议使用适当的API。谢谢大家,我没有意识到XML阅读器……谢谢,我想我会尝试ReadBlock,因为: