Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/27: Рейтинг темы: голосов - 27, средняя оценка - 4.63
3 / 3 / 2
Регистрация: 10.03.2010
Сообщений: 51
.NET 4.x

Чтение запись файлов *.csv больших размеров

24.01.2012, 11:59. Показов 5507. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!
Нужно сделать:
• прочитать данные таймсерий из файла (прилагается test.csv)
• подсчитаете SMA(20) таймсерий и сохраните его в другой выходной файл.
Примечание: исходный файл содержит данные о ценах в нескольких компаниях. Идентификатор компании хранится(находится) в первом столбце файла. Программа должна вычислить SMA таймсерии индивидуально для каждой компании. Исходный файл может быть большим (несколько гигабайт, и может не поместиться в оперативной памяти).

Исходный файл выглядит так:
symbol,date/time,Price
IBM,08/30/2010 06:50:00.0,124.7300
MSFT,08/30/2010 07:07:00.0,23.9300
CAT,08/30/2010 08:01:00.0,66.1200
MSFT,08/30/2010 08:21:00.0,23.9400
IBM,08/30/2010 08:49:00.0,124.8300
... (размер м. б. такой, что не поместится в ОЗУ)

Вот код, работает, но не предусматривает проверку и работу с большими файлами:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;
 
namespace Task
{
    class SMA_Analysis
    {
        public string FileName { get; set; }
 
        public SMA_Analysis(string fileName)
        {
            this.FileName = fileName; 
        }
 
        public void ReadWriteSVC()
        {
            NumberFormatInfo nfi = new CultureInfo("ru-RU", false).NumberFormat; // отключить русский сеператор ','
            nfi.NumberDecimalSeparator = ".";
            int n = 20; // период таймсерии
            CultureInfo provider = CultureInfo.InvariantCulture;
            List<SMAData> listTimeseriesData = new List<SMAData>();
            StreamReader sReader = new StreamReader(FileName);
            string fileCSV = sReader.ReadToEnd();
            sReader.Close();
            string[] listCVSStrings = fileCSV.Split(Environment.NewLine.ToCharArray());
            // проход по всем строкам (у первой строки нету формата)
            for (int i = 1; i < listCVSStrings.Count()-1; i++)
            {
                // построчный проход
                string[] listCSVStringWords = listCVSStrings[i].Split(',');
                // добавление данных в список
                listTimeseriesData.Add(new SMAData(listCSVStringWords[0], DateTime.ParseExact(listCSVStringWords[1], "MM/dd/yyyy HH:mm:ss.f", provider),
                double.Parse(listCSVStringWords[2], nfi)));
            }
 
            // определение списка уникальных id компаний
            List<String> listUniqueIDCompany = new List<string>();
            for (int i = 0; i < listTimeseriesData.Count()-1; i++)
            {
                if (!listUniqueIDCompany.Contains(listTimeseriesData[i].ID))
                {
                    listUniqueIDCompany.Add(listTimeseriesData[i].ID);
                }
            }
 
            // формирование и запись в файл SMA(20) последовательно для каждой из компаний
            List<SMADataCurrentCompany> listCompanyData = new List<SMADataCurrentCompany>();
 
            // данные по компаниям
            for (int i = 0; i < listUniqueIDCompany.Count(); i++)
            {
                List<SMAData> lData_ = new List<SMAData>();
                for (int j = 0; j < listTimeseriesData.Count; j++)
                {
                    if (listTimeseriesData[j].ID == listUniqueIDCompany[i])
                       lData_.Add(listTimeseriesData[j]); 
                }
                listCompanyData.Add(new SMADataCurrentCompany(lData_));
            }
 
            // подсчет SMA(20) таймсерий 
            List<SMATimeseriesResult> listSMAbyIdCompany = new List<SMATimeseriesResult>(); // список SMA таймсерий для всех компаний в порядке очередности
            
            for (int i = 0; i < listUniqueIDCompany.Count(); i++)
            {
                double sum = 0;
                List<SMAData> listSMAForSpecificCompany = new List<SMAData>(); // список SMA таймсерий для конкретной компании
                for (int j = 0; j < listCompanyData[i].listSD.Count(); j++)
                {
                    if (j < n-1) 
                    {
                        sum += listCompanyData[i].listSD[j].Price;
                    }
                    else if (j == n-1)
                        {
                            double SMAi = sum / n;
                            listSMAForSpecificCompany.Add(new SMAData(listCompanyData[i].listSD[j].ID, listCompanyData[i].listSD[j].Time, SMAi));
                        }
                    else
                        {
                            double SMAi = (sum + listCompanyData[i].listSD[j].Price - listCompanyData[i].listSD[j - 20].Price) / 20; 
                            listSMAForSpecificCompany.Add(new SMAData(listCompanyData[i].listSD[j].ID, listCompanyData[i].listSD[j].Time, SMAi));
                        }
                }
                listSMAbyIdCompany.Add(new SMATimeseriesResult(listSMAForSpecificCompany));
            }
 
            // вывод данных SMA на экран
            StringBuilder sb = new StringBuilder();
 
            for (int s = 0; s < 10; s++)
            {
                sb.Append("IdCompany= " + listSMAbyIdCompany[0].listSMA[s].ID + " DateTime= " + listSMAbyIdCompany[0].listSMA[s].Time.ToString() + " Price= " + listSMAbyIdCompany[0].listSMA[s].Price.ToString() + Environment.NewLine);
            }
            Console.WriteLine(sb);
 
            // вывод SMA в файл
            StreamWriter sWriter = new StreamWriter("result.csv");
            sWriter.WriteLine("symbol,date/time,SMA(20)");
            for (int x = 0; x < listSMAbyIdCompany.Count(); x++)
            {
                for (int y = 0; y < listSMAbyIdCompany[x].listSMA.Count(); y++)
                {
                    sWriter.WriteLine(listSMAbyIdCompany[x].listSMA[y].ID + "," + listSMAbyIdCompany[x].listSMA[y].Time + "," 
                        + listSMAbyIdCompany[x].listSMA[y].Price.ToString().Replace(',','.')); 
                }
            }
            sWriter.Close();
            Console.WriteLine("End");
            Console.ReadKey();
        }
 
    }
 
    public class SMAData
    {
        public string ID { get; set; }
        public DateTime Time { get; set; }
        public double Price { get; set; }
 
        public SMAData(string id, DateTime time, double price)
        {
            this.ID = id;
            this.Time = time;
            this.Price = price;
        }
    }
 
    // данные таймсерии для определенной компании
    public class SMADataCurrentCompany
    {
        public List<SMAData> listSD;
        public SMADataCurrentCompany(List<SMAData> list)
        {
            listSD = new List<SMAData>();
            for (int k = 0; k < list.Count(); k++)
            {
                listSD.Add(list[k]);
            }
        }
    }
 
    // SMA(20) таймсерии для определенной компании
    public class SMATimeseriesResult
    {
        public List<SMAData> listSMA;
        public SMATimeseriesResult(List<SMAData> list)
        {
            listSMA = new List<SMAData>();
            for (int k = 0; k < list.Count(); k++)
            {
                listSMA.Add(list[k]);
            }
        }
    }
 
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace Task
{
    class SMA
    {
        static void Main(string[] args)
        {
            SMA_Analysis smaAnalysis = new SMA_Analysis("test.csv");
            smaAnalysis.ReadWriteSVC();
        } 
    }
}
Во первых, как же все-таки обрабатывать огромные файлы?
Во-вторых, можно ли сделать, чтобы на уровне приложения double тип был с плавующей точкой (.),
а не запятой, имел формат с 4 цифрами после точки, как в исходном файле?

Жду Ваших предложений и советов, извиняюсь за свой страшный код
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2012, 11:59
Ответы с готовыми решениями:

Чтение и обработка больших файлов
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на int'ы и посчитать их сумму. Как это сделать максимально...

Многопоточное чтение больших файлов
Привет всем! Подскажите пожалуйста как реализовать многопоточное чтение файла рамером 1gb и больше без загрузки в память? Пробовал...

Чтение больших файлов (несколько гигабайт)
Доброго времени! Нужно прочесть и пропарсить крупный файл весом в несколько гигабайт. Подскажите как это сделать... Заранее благодарю!

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.01.2012, 14:48
Цитата Сообщение от Djoser Посмотреть сообщение
Во первых, как же все-таки обрабатывать огромные файлы?
Считывать по одной строчке, а не все сразу.

Цитата Сообщение от Djoser Посмотреть сообщение
Во-вторых, можно ли сделать, чтобы на уровне приложения double тип был с плавующей точкой (.),
а не запятой, имел формат с 4 цифрами после точки, как в исходном файле?
Да, использовать System.Globalization.CultureInfo.Invaria ntCulture при обработке строк с числами.

Что такое SMA(20)? Подозреваю, что что-то из финансов, но искать самому не хочется.
Если не сложно, в двух словах.

P.S. Так вот зачем вам ParseExact нужен был...
0
3 / 3 / 2
Регистрация: 10.03.2010
Сообщений: 51
24.01.2012, 18:42  [ТС]
Да, использовать System.Globalization.CultureInfo.Invaria ntCulture при обработке строк с числами.
kolorotur, а можно примерчик, который устанавливает формат double числа в *.xxxx, c последующим сохранением в файл!
Да и ещё, неужели, считыванием построчно можно добиться работы с большими файлами, ведь все данные из файла актуальны на все протяжении вычисления SMA(20)?
SMA (20) - простое скользящее среднее, используется на Forex и не только, а 20 - период
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.01.2012, 19:06
Цитата Сообщение от Djoser Посмотреть сообщение
примерчик, который устанавливает формат double числа в *.xxxx, c последующим сохранением в файл
C#
1
File.WriteAllText(3.14.ToString("0.0000"));
Цитата Сообщение от Djoser Посмотреть сообщение
неужели, считыванием построчно можно добиться работы с большими файлами,
Конечно можно.
Вот вы считали весь файл в память, потом разбили его на строки - это еще столько же памяти. Потом каждую строку разбиваете на фрагменты, которые уже используются в объектах - это еще столько же памяти занялось. То есть в вашем алгоритме для обработки файла требуется в три раза больше памяти, чем занимает сам файл.
А так - строчку прочитали, разбили, создали объект. Прочитали, разбили, создали...
Если количество символов такое, что в памяти не помещается, то придется либо кэшировать на диске (долго), либо хранить где-нибудь в базе.
0
 Аватар для Ice_and_Fire
512 / 298 / 37
Регистрация: 22.06.2011
Сообщений: 929
24.01.2012, 20:20
https://www.cyberforum.ru/post1784589.html
и далее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.01.2012, 20:20
Помогаю со студенческими работами здесь

Чтение в richtextbox больших файлов сопровождается большим потреблением памяти приложением
Здравствуйте! Вот мне не понятно: я читаю содержимое файла в RichTextBox (вес этого файла 207 мб). ...

Чтение/запись файлов в сборке
Вечер добрый! Задался целью написать курсовую работу, суть которой ограничить доступ к некоторым бинарным файлам путем установления на...

Получение из БД MSSQL файлов больших размеров
Имеется MS SQL 2000, в котором в поле типа image хранятся файлы. получаю из него файлы я следующим кодом на asp ------------ ...

Чтение файлов больших размеров >1Гб
Товарищи, подскажите как прочитать файл размером больше 1Гб.. у меня при чтении оперативка заканчивается и выдает ошибку.. как можно...

Копирование файлов больших размеров
Задача состоит в том ,чтобы разделить большой файл на части и копировать их в отдельных потоках.Как можно это сделать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru