C# & unity3d - какой самый быстрый способ чтения большого CSV-файла
У меня есть довольно большой набор данных CSV, около 13,5 МБ и примерно 120 000 строк и 13 столбцов. Код ниже раздела "Что я пробовал" - это текущее решение, которое у меня есть.
К счастью, поскольку я запускаю это через сопрограмму Unity, программа не зависает, но это текущее решение занимает 31 минуту и 44 секунды, чтобы прочитать весь CSV-файл целиком.
Есть ли другой способ сделать это? Я пытаюсь нацелиться на время синтаксического анализа менее 1 минуты.
Что я уже пробовал:
private IEnumerator readDataset() { starsRead = 0; var totalLines = File.ReadLines(path).Count(); totalStars = totalLines - 1; string firstLine = File.ReadLines(path).First(); int columnCount = firstLine.Count(f => f == ','); string[,] datasetTable = new string[totalStars, columnCount]; int lineLength; char bufferChar; var bufferString = new StringBuilder(); int column; int row; using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (BufferedStream bs = new BufferedStream(fs)) using (StreamReader sr = new StreamReader(bs)) { string line = sr.ReadLine(); while ((line = sr.ReadLine()) != null) { row = 0; column = 0; lineLength = line.Length; for (int i = 0; i < lineLength; i++) { bufferChar = line[i]; if (bufferChar == ',') { datasetTable[row, column] = bufferString.ToString(); column++; } else { bufferString.Append(bufferChar); } } row++; starsRead++; yield return null; } } }
F-ES Sitecore
Одна из проблем заключается в том, что Вы читаете файл дважды. Если вы делаете ReadLines().Подсчитайте, что вы анализируете весь файл. С таким же успехом вы можете просто вызвать ReadLines, сохранить его в массиве или списке и проанализировать его строка за строкой.