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时添加行号