我的文本文件包含这样的行:
@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...
我需要将这些字符串分成两个不同的数组。到目前为止,我只设法将所有内容存储在一个数组中。
这是我在数组中存储的代码:
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);
}
答案 0 :(得分:0)
以@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();
}
但我认为并非每一行都以“@data”开头
所以你可能想阅读所有的行并做这样的事情:
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
答案 1 :(得分:0)
@relation SMILEfeatures和@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);
答案 2 :(得分:0)
问题不是很清楚。但我的看法是,在一个存储桶中收集以@relation或@attribute开头的所有行,然后收集另一个存储桶中的所有数字行。我选择忽略@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);
}