Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
1

Текстовый файл. строка с 3 "объектами" разделенные разделителем "," как обратиться к каждому из объектов?

31.07.2013, 20:12. Показов 1094. Ответов 11
Метки нет (Все метки)

Всем добрый день.

Имеется текстовый файл.

содержимое: более 31.000 строк.

каждая строка имеет примерно вот такой вид:


1299988801,37.05,1.3903
1299992401,37.05,1.3903
1299996002,37.06,1.3903
1299999601,37.08,1.3903
1300003201,37.09,1.3903
1300006801,37.03,1.3903
1300010402,37.07,1.3903
1300014001,37.09,1.3903
1300017602,37.09,1.3903

все 3 значения меняются.

Строки записываются в файл через консольное приложения. Цикл. В этот цикл хотелось бы добавить (а если не в цикл то вообще как можно еще - буду рад любому решению) несколько операций

Мне необходимо :

1) В каждой строке с первым "объектом" - 1300006801 провести пару математических манипуляций.

2) со вторым объектом - 37.05 - так же нужно провести пару математических действия. причем это одинаковые действия.

Вопрос как это сделать?? как обратиться к этим "объектам"


мой код:

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            int counter = 0;
            string line;
            int name = 189;
            int lin = 0;
            // Read the file and display it line by line.
 
            using (System.IO.StreamWriter file2 = new System.IO.StreamWriter(@"C:\Users\David\Desktop\OOO.txt"))
 
                while (counter < 190)
                {
 
                    System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\David\Desktop\Oanda\" + name + ".csv");
 
                    while ((line = file.ReadLine()) != null)
                    {
                        // Если не начинается на www, то записываем в файл
 
                        if (!line.StartsWith("timestamp"))
                        {
                            if (!String.IsNullOrWhiteSpace(line))
                            {
                                System.Console.WriteLine(line);
 
                                file2.WriteLine(line);
                                lin++;
                            }
                        }
                    }
 
 
                    file.Close();
 
                    name--;
                    counter++;
                }
 
            System.Console.WriteLine("There were {0} lines.", lin);
            System.Console.WriteLine("There were {0} files.", counter);
 
 
            System.Console.ReadLine();
 
 
 
        }
    }
}
Заранее огромное спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2013, 20:12
Ответы с готовыми решениями:

Даны текстовый файл "F" и строка "S". Получить все строки файла "F", содержащие в качестве фрагмента строку "S".
Плиз помогите написать прогу: Даны текстовый файл &quot;F&quot; и строка &quot;S&quot;. Получить все строки файла &quot;F&quot;,...

Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "."
Не могу ни как собразить как написать регулярное выражение для выдергивания английских букв и...

Составить фразу "текстовый редактор" из слов "тесто", "редакция", "мотор", "который"
1) Составить фразу &quot;текстовый редактор&quot; из слов &quot;тесто&quot;, &quot;редакция&quot;, &quot;мотор&quot;, &quot;который&quot;.

Дан массив строк: "red", "green", "black", "white", "blue". Запишите в файл элементы массива построчно (в новой строке)
пишу так но не помогает: static void Main(string args) { string...

11
Эксперт Java
4077 / 3811 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
31.07.2013, 21:57 2
Цитата Сообщение от David-Net Посмотреть сообщение
Вопрос как это сделать?? как обратиться к этим "объектам"
Считываете в цикле строки.
Для каждой строки - ищете первое вхождение запятой (String.IndexOf). Отделяете кусок этой строки до первой запятой (String.Substring), Переводите полученный кусок строки в числовой тип(decimal.Parse). И так далее еще 2 раза.

Вроде все просто.
0
1232 / 1042 / 293
Регистрация: 07.03.2012
Сообщений: 3,245
31.07.2013, 22:31 3
так можно:
C#
1
2
3
4
5
6
7
8
using (System.IO.StreamReader reader = System.IO.File.OpenText("text.txt"))
            {
                while (!reader.EndOfStream)
                {
                    string str = reader.ReadLine();
                    string[] vals = str.Split(new char[] { ',' });//в массиве будут три эл-та:то что до первой запятой, то то после, и то что после второй запятой
                }
            }
0
2 / 2 / 0
Регистрация: 31.07.2013
Сообщений: 29
31.07.2013, 22:31 4
через string.substring() - http://msdn.microsoft.com/en-u... 44szs.aspx
у тебя похоже длина чисел везде одинакова, потому параметры для substring будут статичными и не нужен цикл
делим каждую строку на три переменные. конвертим их в Int и Double и крутим как хотим
0
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
31.07.2013, 23:46  [ТС] 5
Цитата Сообщение от mitmit Посмотреть сообщение
через string.substring() - http://msdn.microsoft.com/en-u... 44szs.aspx
у тебя похоже длина чисел везде одинакова, потому параметры для substring будут статичными и не нужен цикл
делим каждую строку на три переменные. конвертим их в Int и Double и крутим как хотим

Во-первых огромное спасибо - очень помогло. (всем остальным так же огромное спасибо. Я думаю что и ваши методы рабочии- просто почему то решил начать с этого и ПОЧТИ все получилось)

Да, кстати на счет ПОЧТИ.

у меня в третьем объекте: (1.3903) встречается иногда разные длины (1,433, 1,42) и так далее минимум 2 - максимум 4 знака после запятой.

Мне очень понравился тот метод что вы написали - вопрос--можно ли как то обработать это маленькое исключение???

Спасибо

Добавлено через 15 минут
Сейчас внимательнее посмотрел - у меня и второе значение иногда принимает 2 символьное значение
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2013, 00:00 6
C#
1
2
3
4
5
lines[] = line.split (',');
if (lines.Length == 3){
   int i = Convert.ToInt64 (lines[0]);
...
}
и накакой разницы, какая там длина. лишь бы их было три, и разделены запятыми.
0
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
01.08.2013, 01:45  [ТС] 7
C#
1
2
3
4
5
lines[] = line.split (',');
if (lines.Length == 3){
   int i = Convert.ToInt64 (lines[0]);
...
}
и накакой разницы, какая там длина. лишь бы их было три, и разделены запятыми.

Спасибо - почти получилось - но только с тойкой не хочет дружить

Цитата Сообщение от turbanoff Посмотреть сообщение
decimal.Parse)
и он тоже.

хотя скорее всего я что то не так делаю?
0
2 / 2 / 0
Регистрация: 31.07.2013
Сообщений: 29
01.08.2013, 04:54 8
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double[] values = new double[3]; //массив под три значения
            string str = textBox1.Text; //как пример читаем с текстБокса
            int j = 0; int q = 0; //один - счетчик по массиву values, другой для substring
            for (int i = 0; i < str.Length; i++) //цикл перебора всех символов в данной строке
            {
                double d = 0; //эту переменную вводим, чтобы записывать только правильно введенное число, а точнее если будут пробелы - то чтобы программа не впадала в ступор
                if (j < 2) //последнее значение не имеет в конце запятой или еще какого-либо знака, поэтому первые два определяем здесь, а последний выбрасываем на else где считываем все до конца строки
                {
                    if (str[i] == ',') //можно перечислить и другие знаки через ИЛИ
                    {
                        if (double.TryParse(str.Substring(q, i - q), out d)) values[j] = d; //проверяем чтобы было число и если будут пробелы, то таким образом мы избавимся от них (т.е. можно хоть так задавать: 1.231,    1.112,                   1.341)
                        q = i + 1;//ставим в то положение + 1, где была "," или иной знак
                        j++;//увеличиваем на 1 счетчик массива значений
                    }                    
                }
                else
                {
                    if (double.TryParse(str.Substring(q, str.Length - q), out d)) values[j] = d; //записываем последнее значение + 1 от предыдущего знака "," и до конца строки
                    break; //прерываем цикл - все равно значений больше не будет
                }
            }
MessageBox.Show(values[0] + "\t" + values[1] + "\t" + values[2] + "\n" + (values[0] + values[1] + values[2])); //для примера выводим что получилось и считаем сумму, чтобы было видно, что везде числа
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2013, 10:03 9
Цитата Сообщение от David-Net Посмотреть сообщение
- но только с точкой не хочет дружить
может, в текущей культуре ожидается десятичная запятая? тогда геморройней, но тоже решаемо. или что значит "не хочет дружить"?
0
3 / 3 / 0
Регистрация: 30.07.2013
Сообщений: 135
01.08.2013, 13:10  [ТС] 10
пишет что входная строка имела не правильный формат

Добавлено через 52 минуты
Ребят - всем спасибо . Решил задачу.

в общем там нужно было что бы стояла именно запятая а не точка между цифрами.

пришлось провести 2 разных метода replace чтобы все хорошо работала. спасибо всем кто откликнутся на помощь
0
2 / 2 / 0
Регистрация: 31.07.2013
Сообщений: 29
01.08.2013, 15:41 11
все зависит от настройки разделителя целой от дробной части (язык и региональные стандарты в панели управления). если в системе стоит точка - тогда точка, если запятая - соответственно.
если в числах запятая как разделитель между целой и дробной частями, а также та же запятая стоит между двумя разными числами, тогда при переборе нужно уточнить, чтобы отлавливать каждую вторую запятую как конец числа для i-той переменной и каждую первую для разделения числа на целую и дробные части.
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2013, 16:10 12
Цитата Сообщение от David-Net Посмотреть сообщение
в общем там нужно было что бы стояла именно запятая а не точка между цифрами.
вовсе не обязательно:

C#
1
2
3
double pi = Double.Parse ("3.1415"
                  , System.Globalization.NumberStyles.Any
                  , System.Globalization.CultureInfo.GetCultureInfo ("en-US));
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2013, 16:10

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Получить значение из {"text1":"val1","text2":"val2","text3":{"text":"val"}}
Есть такая строка var my = '{&quot;text1&quot;:&quot;val1&quot;,&quot;text2&quot;:&quot;val2&quot;,&quot;text3&quot;:{&quot;text&quot;:&quot;val&quot;}}'; Как из...

Известны сорта роз, выращиваемых тремя цветоводами: "Анжелика", "Виктория", "Гагарин", "Ave Maria", "Катарина", "Юбилейн
Известны сорта роз, выращиваемых тремя цветоводами: &quot;Анжелика&quot;, &quot;Виктория&quot;, &quot;Гагарин&quot;, &quot;Ave...

Решение заданий типа "Array","Matrix","String","File","Text"""
большая просьба помочь решить где-то около 35-40 (из 100) задач (мне не понятных) типа массив и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.