Сохранить текстовые файлы данных в функцию массива в C#
Я создал функцию для построения графика данных:
public void ShowGraphData(long lTotalData)
{
double[] dx = new double[lTotalData];
double[] dy = new double[lTotalData];
for (long li = 0; li < lTotalData; li++)
{
dx[li] = GlobalDataClass.dDataArray[li, 0];
dy[li] = GlobalDataClass.dDataArray[li, 1];
}
zedGraphControlStickiness.GraphPane.CurveList.Clear();
GraphPane StickinessPane = zedGraphControlStickiness.GraphPane;
// PointPairList holds the data for plotting, X and Y arrays
PointPairList spl1 = new PointPairList(dx, dy);
// Add cruves to myPane object
LineItem ProductionCurve = StickinessPane.AddCurve("Insertion Force", spl1, Color.Blue, SymbolType.None);
ProductionCurve.Line.Width = 2.0F;
zedGraphControlStickiness.AxisChange();
zedGraphControlStickiness.Invalidate();
zedGraphControlStickiness.Refresh();
GlobalDataClass.iTotalReadingPoint = lTotalData;
}
Затем я использую файловый поток, чтобы открыть текстовый файл:
if ((myStream = openFileDialog1.OpenFile()) != null)
{
using (myStream)
{
//save data to list array.
}
}
Мне нужно загрузить TXT и сохранить данные содержат несколько строк в виде массива в lToTalData в функции Showgraph. мой текстовый файл выглядит так:
10,20
20,30
30,40
40,50
50,60
Может ли кто-нибудь помочь мне, как я могу это сделать?
4 ответа
Использование
List<string> _lineValues = File.ReadLines(@"File Path").ToList();
или же
List<string> _lineValues = File.ReadAllLines(@"File Path").ToList();
Как я правильно понимаю, вы хотите двойной массив? тогда вы должны попробовать что-то вроде этого:
но имейте в виду, что если строка в вашем коде не может быть преобразована в двойную, этот пример выдаст ошибку
double[] _array = File.ReadAllLines("path").Select(v => double.Parse(v)).ToArray();
Проблема все в преобразовании данных файла в соответствующие массивы. Если вы не знаете точное число значений во входном файле, лучше всего использовать List<double>
вместо массива фиксированной длины
List<double> dx = new List<double>();
List<double> dy = new List<double>();
if(DialogResult.OK == openFileDialog1.ShowDialog())
{
int x = 1;
if(openFileDialog1.FileName != string.Empty)
{
CultureInfo ci = CultureInfo.InvariantCulture;
// Load everything in an IEnumerable of strings
var lines = File.ReadLines(openFileDialog1.FileName);
// start the enumeration
foreach(string s in lines)
{
double temp;
// If on even line put the value in the dy list
if((x % 2) == 0)
{
if(double.TryParse(s, NumberStyles.Any, ci, out temp))
dy.Add(temp);
}
else
{
// on odd line put in the dx list
if(double.TryParse(s, NumberStyles.Any, ci, out temp))
dx.Add(temp);
}
x++;
}
}
}
В конце у вас есть два списка двойников. Использование списка вместо массива должно быть лучшим выбором, и его легко заменить (вы можете индексировать список как массив, но иметь лучшую функциональность, когда вам нужно добавить новые значения). Если вам действительно нужно использовать массив, вы всегда можете написать
PointPairList spl1 = new PointPairList(dx.ToArray(), dy.ToArray());
Однако требуется некоторая проверка ошибок, например, что делать, если одна из ваших строк не может быть преобразована в двойное значение.
Извините, но чтобы прояснить это, (long lTotalData) на самом деле является количеством строк в текстовом файле. Так что функция получит количество строк. Итак, код:
double[] dx = new double[lTotalData];
double[] dy = new double[lTotalData];
for (long li = 0; li < lTotalData; li++)
{
dx[li] = GlobalDataClass.dDataArray[li, 0];
dy[li] = GlobalDataClass.dDataArray[li, 1];
}
Он зациклит строку и сохранит каждую строку в массиве dx[li],d[li]. Рассмотрим данные в текстовом формате, как:
х, у
х, у
х, у
х, у
теперь я просто хочу узнать, как передать число строк в функцию и позволить функции зациклить строки, чтобы получить хранилище значений в массиве dx, dy.