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

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

24.01.2012, 11:59. Показов 4677. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2012, 11:59
Ответы с готовыми решениями:

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

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

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

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

4
Эксперт .NET
15555 / 11804 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
24.01.2012, 14:48 2
Цитата Сообщение от Djoser Посмотреть сообщение
Во первых, как же все-таки обрабатывать огромные файлы?
Считывать по одной строчке, а не все сразу.

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

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

P.S. Так вот зачем вам ParseExact нужен был...
0
3 / 3 / 2
Регистрация: 10.03.2010
Сообщений: 51
24.01.2012, 18:42  [ТС] 3
Да, использовать System.Globalization.CultureInfo.InvariantCulture при обработке строк с числами.
kolorotur, а можно примерчик, который устанавливает формат double числа в *.xxxx, c последующим сохранением в файл!
Да и ещё, неужели, считыванием построчно можно добиться работы с большими файлами, ведь все данные из файла актуальны на все протяжении вычисления SMA(20)?
SMA (20) - простое скользящее среднее, используется на Forex и не только, а 20 - период
0
Эксперт .NET
15555 / 11804 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
24.01.2012, 19:06 4
Цитата Сообщение от Djoser Посмотреть сообщение
примерчик, который устанавливает формат double числа в *.xxxx, c последующим сохранением в файл
C#
1
File.WriteAllText(3.14.ToString("0.0000"));
Цитата Сообщение от Djoser Посмотреть сообщение
неужели, считыванием построчно можно добиться работы с большими файлами,
Конечно можно.
Вот вы считали весь файл в память, потом разбили его на строки - это еще столько же памяти. Потом каждую строку разбиваете на фрагменты, которые уже используются в объектах - это еще столько же памяти занялось. То есть в вашем алгоритме для обработки файла требуется в три раза больше памяти, чем занимает сам файл.
А так - строчку прочитали, разбили, создали объект. Прочитали, разбили, создали...
Если количество символов такое, что в памяти не помещается, то придется либо кэшировать на диске (долго), либо хранить где-нибудь в базе.
0
486 / 298 / 36
Регистрация: 22.06.2011
Сообщений: 929
24.01.2012, 20:20 5
https://www.cyberforum.ru/post1784589.html
и далее
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2012, 20:20

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru