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

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

24.01.2012, 11:59. Показов 5548. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru