Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从特定位置读取文本文件并存储在两个数组中_C#_Arrays_File_Text - Fatal编程技术网

C# 从特定位置读取文本文件并存储在两个数组中

C# 从特定位置读取文本文件并存储在两个数组中,c#,arrays,file,text,C#,Arrays,File,Text,我有一个文本文件,其中包含如下行: @relation SMILEfeatures @attribute pcm_LOGenergy_sma_range numeric @attribute pcm_LOGenergy_sma_maxPos numeric @attribute pcm_LOGenergy_sma_minPos numeric... 其中大约有6000行这些属性,在属性之后是这样的行: @data 1.283827e+01,3.800000e+01,2.000000e+00,5

我有一个文本文件,其中包含如下行:

@relation SMILEfeatures
@attribute pcm_LOGenergy_sma_range numeric
@attribute pcm_LOGenergy_sma_maxPos numeric
@attribute pcm_LOGenergy_sma_minPos numeric...
其中大约有6000行这些属性,在属性之后是这样的行:

@data
1.283827e+01,3.800000e+01,2.000000e+00,5.331364e+00
1.850000e+02,4.054457e+01,4.500000e+01,3.200000e+01...
string allLines;
using(StreamReader sr = new StreamReader(yourfile))
{
    allLines = = sr.ReadToEnd();
}


var arrays = allLines.Split("@data");

// arrays[0] is the part before @data
// arrays[1] is the part after @data (the numbers)
// But array[1] does not contain @data
我需要将这些字符串分成两个不同的数组。到目前为止,我只设法将所有内容存储在一个数组中

以下是我在阵列中存储的代码:

 using (var stream = new FileStream(filePath, FileMode.OpenOrCreate))
                {
                using (var sr = new StreamReader(stream))
                {
                    String line;

                   while ((line = sr.ReadLine()) != null)
                    {
                            sb.AppendLine(line);
                    }
                 }
               string allines = sb.ToString();
               Console.WriteLine(sb);
                 }

所有以@relation SMILEfeatures开头并包含@attribute的字符串都应存储在第一个数组中。以@data开头的数字应存储在第二个数组中

使用
string.Contains()
string.StatsWith()
进行检查

阅读每一行,并决定在哪个数组/列表中放置这一行

void ReadAndSortInArrays(string fileLocation)
{
    List<string> noData = new List<string>();
    List<string> Data = new List<string>();

    using(StreamReader sr = new StreamReader(fileLocation))
    {
        string line;

        while(!sr.EndOfStream)
        {
            line = sr.ReadLine();

            if(line.StartsWith("@relation") && line.Contains("@attribute"))
            {
                noData.Add(line);
            }
            else if(line.StartsWith("@data")
            {
                Data.Add(line);
            }
            else
            {
                // This is stange
            }
        }
    }

    var noDataArray = noData.ToArray();
    var DataArray = Data.ToArray();
}

@relation SMILEfeatures和contains@attribute之后的所有字符串都存储在第一个数组中。@data之后的所有字符串都应存储在第二个数组中。希望这是你想要的

        var relationLineNumbers = new List<int>();
        var dataLineNumbers = new List<int>();
        var relation = new StringBuilder();
        var data = new List<string>();

        using (var stream = new FileStream(filepath, FileMode.OpenOrCreate))
        {
            using (var sr = new StreamReader(stream))
            {
                string line;
                bool isRelation = false;
                bool isData = false;

                int lineNumber = 0;
                while ((line = sr.ReadLine()) != null)
                {
                    lineNumber++;

                    if (line.StartsWith("@relation SMILEfeatures"))
                    {
                        isRelation = true;
                        isData = false;
                        continue;
                    }

                    if (line.StartsWith("@data"))
                    {
                        isData = true;
                        isRelation = false;
                        continue;
                    }

                    if (isRelation)
                    {
                        if (line.StartsWith("@attribute"))
                        {
                            relation.Append(line);
                            relationLineNumbers.Add(lineNumber);
                        }
                    }

                    if (isData)
                    {
                        data.AddRange(line.Split(','));
                        dataLineNumbers.Add(lineNumber);
                    }
                }
            }

            Console.WriteLine("Relation");
            Console.WriteLine(relation.ToString());
            Console.WriteLine("Data");
            data.ForEach(Console.WriteLine);
var relationLineNumbers=新列表();
var dataLineNumbers=新列表();
变量关系=新的StringBuilder();
var data=新列表();
使用(var stream=newfilestream(filepath,FileMode.OpenOrCreate))
{
使用(var sr=新的StreamReader(stream))
{
弦线;
bool isRelation=false;
bool-isData=false;
int lineNumber=0;
而((line=sr.ReadLine())!=null)
{
lineNumber++;
if(line.StartsWith(“@relation SMILEfeatures”))
{
isRelation=true;
isData=false;
持续
}
if(第行StartsWith(“@data”))
{
isData=true;
isRelation=false;
持续
}
如果(关系)
{
if(line.StartsWith(“@attribute”))
{
关系。追加(行);
关系行号。添加(行号);
}
}
如果(isData)
{
data.AddRange(line.Split(',');
添加(行号);
}
}
}
控制台。写入线(“关系”);
Console.WriteLine(relation.ToString());
控制台写入线(“数据”);
data.ForEach(Console.WriteLine);

问题不是很清楚。但我的想法是,收集一个bucket中以@relation或@attribute开头的所有行,然后收集另一个bucket中的所有数字行。我选择忽略@data行,因为它们似乎不包含任何额外信息

可以通过确保数据行(即数字行)包含逗号分隔的可解析数值列表来执行错误检查

var dataLines = new List<string>();
var relAttLines = new List<string>();

foreach (var line in File.ReadAllLines())
{
    if (line.StartsWith("@relation") || line.StartsWith("@attribute"))
        relAttLines.Add(line);
    else if (line.StartsWith("@data"))
        //ignore these
        continue;
    else
        dataLines.Add(line);
}
var dataLines=newlist();
var relAttLines=新列表();
foreach(文件.ReadAllLines()中的var行)
{
if(line.StartsWith(“@relation”)| | line.StartsWith(“@attribute”))
relAttLines.Add(行);
else if(第行StartsWith(“@data”))
//忽略这些
持续
其他的
数据行。添加(行);
}

问题是什么?哪些字符串应该在第二个数组中?所有以
@relation SMILEfeatures
开头并包含@属性的字符串都应该存储在第一个数组中。以
@data
开头的数字应该存储在第二个数组中。表示一个字符串=一行?或者@数据只在每个段落之前ph?我指的是行。一个大段落后面有属性,另一个段落后面有数字。现在你正在阅读文件中的所有文本,不是吗?一个更简单的方法是:string text=System.IO.file.ReadAllText(filePath);若要获取文本的指定部分,我建议使用String.Split()方法(如果您有分隔的部分或String.Substring())方法。System.String类有很多方法可以使用,请签出MSDN以找到合适的方法。您也可以使用
File.ReadAllLines
。如何拆分字符串?我编写了
sbData.append(line.split(','))
但它不起作用。我遗漏了什么或做错了什么?我已经编辑了代码段。因为您想分割数据,我使用了列表而不是字符串生成器。还有一个问题。我需要知道哪些行特定的属性在数组中,并将行号存储在数组中。如何做到这一点?例如,我需要知道这是在哪些行中执行的属性为并在数组中存储行号:
@attribute pcm\u LOGenergy\u sma
\u range您需要使用整数来存储行数并在while循环中递增行数。为行号创建两个数组,并在附加到stringbuilder/list时添加行号