Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

Считывание с txt и запись в ado

27.11.2014, 20:54. Показов 2430. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добро всем!
в тхт файле у меня порядка 1000 строк с шапкой, вот в таком виде:
PHP
1
2
3
Сумма      Ф.И.О.                Адрес -кв                        № платежа             Дата      
300          Абрамович          Весенняя 2/2-15               23125                    11.11.2014
150          Кац                    Гагарина 32-18                  1284                    11.11.2014
считываю и заношу в переменные так:
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
Form1->ADOQuery1->RecNo=a;
str->LoadFromFile(ExtractFilePath(Application->ExeName)+"reestr\\Реестр.txt");
AnsiString kv="",fam="",adr="",sum="",Pn,Pdd=""; // Day переменная для выдергивания даты в шапку после разноски реестра
int i=0;
for(int m=0;m<str->Count;m++)     
{
i=0;
kv="";fam="";adr="";sum="";Pn="";Pdd="";
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else sum+=str->Strings[m].c_str()[i];
  }
  for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else fam+=str->Strings[m].c_str()[i];
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)'/') adr+="-";
  else
  {
  if((int)str->Strings[m].c_str()[i]==(int)'-') break;
  else adr+=str->Strings[m].c_str()[i];
  }
  }
i++;
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else kv+=str->Strings[m].c_str()[i];
  }
 
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else Pn+=str->Strings[m].c_str()[i];
  }
 
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]!=(int)' ') break;
  }
for(;;i++)
  {
  if((int)str->Strings[m].c_str()[i]==(int)' ') break;
  else Pdd+=str->Strings[m].c_str()[i];
  }
проблема в том что иногда первую строку считывает а потом теряет...
Хочу по новой этот код переделать, очень грузит систему
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2014, 20:54
Ответы с готовыми решениями:

Запись в Excel поcредством ADO
Здраствуйте. Подскажите пожалуйста как можно осуществить запись данных в Excel посредством ADO. Уже больше недели рою интернет в...

Считывание текста у txt файла.Прoблема с кириллицой(с кодировкой)(консоль)
Проблема в следующем,когда я создаю txt файл обычным текстовым редактором windows а он используют кодировку Ansi. То когда моя программа...

считывание и запись в файл
здравствуйте! есть прожка на с++ билдер, расчетная, которая выдает одно значение, и есть файл rtf, следующего вида: угол А, угол Б,...

38
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 07:36
А файл хоть как-то структурирован? Я имею в виду тот момент, как расположены поля в файле.
Например, поле сумма занимает позиции с 1 по 15
поле ФИО - с 16 по 50
и т.д.
Или, может быть, поля разделены не пробелами, а табуляцией?
ничего такого в файле не наблюдается? Или полный хаос?
1
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 08:55
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Вот так попробуй...
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  struct _sAbonent {String Summ, FIO, Address, nPlat, Dt;} Abn;
  TStringList *One = new TStringList;
  TStringList *Two = new TStringList;
  One->LoadFromFile("111.txt");
  for(int i = 1; i < One->Count; i++)
   {
     if(One->Strings[i].Trim().Length() != 0)
      {
        Two->CommaText = One->Strings[i];
        Abn.Summ = Two->Strings[0];
        Abn.FIO = Two->Strings[1];
        Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
        StringReplace(Abn.Address, "/", "-", TReplaceFlags() << rfReplaceAll);
        Abn.nPlat = Two->Strings[4];
        Abn.Dt = Two->Strings[5];
//Вот тут что-то с данными делаешь, в БД добавляешь или что-то еще
//Я для примера в Мемо вывел
        Memo1->Lines->Add(Abn.Summ);
        Memo1->Lines->Add(Abn.FIO);
        Memo1->Lines->Add(Abn.Address);
        Memo1->Lines->Add(Abn.nPlat);
        Memo1->Lines->Add(Abn.Dt);
        Memo1->Lines->Add("&&&&&&&&&&&&&&&");
//----------------------------------------
      }
   }
  delete One;
  delete Two;
}
Изображения
 
1
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 08:58
Уточнение: вместо 14-й и 15-й строк пишем
C++
1
Abn.Address = StringReplace(Two->Strings[2] + " " + Two->Strings[3], "/", "-", TReplaceFlags() << rfReplaceAll);
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.11.2014, 09:53
Samrisbe, программисты-старообрядцы считают, что, если к коде какой-то кусок полностью повторяется пятьсот раз подряд, то его стоит вынести в функцию. По крайней мере подумать об этом. Ну или на крайний случай просто сочинить хокку из этих строк.
Цитата Сообщение от Samrisbe Посмотреть сообщение
проблема в том что иногда первую строку считывает а потом теряет...
Хочу по новой этот код переделать, очень грузит систему
Значит надо переделывать.
И очень хорошо, что вы к этому пришли.

Вообще алгоритм ужасающий. Как я понял, нужно просто распарсить строки, и положить каждый элемент каждой строки в отдельную переменную, да?
Почему бы тогда не использовать старый индейский подход с двумя стринглистами? В первый заносится весь текст, разбитый построчно. Организуется цикл по его строкам. А во второй каждый раз новая строка из первого. Таким образом каждый элемент внутреннего стринглиста будет содержать одно слово строки. И никаких сотен циклов.

Цитата Сообщение от D1973 Посмотреть сообщение
поля разделены не пробелами, а табуляцией?
Вот это самый важный вопрос. Если там табуляция, то весь алгоритм пишется на коленке за десять минут.
Если там пробелы, тогда худо.

P.S. str обычно это строка типа String.
1
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 11:20
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Если там пробелы, тогда худо.
Вот тогда и срабатывает "старый индейский подход..." (см. выше)
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.11.2014, 11:26
D1973, не. Была б табуляция, то элементы внутреннего стринглиста разделились бы так:
300 Абрамович Весенняя 2/2-15 23125 11.11.2014
Красота.
Но, если там просто пробелы, то получим:
300 Абрамович Весенняя 2/2-15 23125 11.11.2014
1
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 11:29

Не по теме:

SatanaXIII, твои любимые таблички? :)


Именно это я и учитывал в этой вот строке
C++
1
Abn.Address = Two->Strings[2] + " " + Two->Strings[3];
т.е. адрес составляем из двух строк...
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.11.2014, 11:31

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
твои любимые таблички?
Не. Мои любимые картинки. :tender: Таблички это так, когда нет картинок. Х)



Цитата Сообщение от D1973 Посмотреть сообщение
Именно это я и учитывал в этой вот строке
В этой строке есть единственный и очень большой косяк. Угадаете? ))
1
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 11:36
Или я слишком трепетно отношусь к своим творениям или угадывалка сломалась...
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.11.2014, 11:44
D1973, прочитайте внимательно в моих табличках фамилию. Ви думаете можете так просто прийти и распарсить строку с произвольно расставленными пробелами таки?

На самом деле два ключевых слова: магия и числа. Что означает либо численная магия, либо магические числа. И то, и то за гранью разумения точной науки, коей является программирование. И вообще мы все умрем. Спасибо за внимание.

А так ваш код конечно удовлетворяет частному случаю. Все хорошо.
2
28.11.2014, 11:50

Не по теме:

Точно, точно...

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ви думаете можете так просто прийти и распарсить строку с произвольно расставленными пробелами таки?
Вот шо бы да, так - нет!

0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 11:52  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
А файл хоть как-то структурирован? Я имею в виду тот момент, как расположены поля в файле.
Например, поле сумма занимает позиции с 1 по 15
поле ФИО - с 16 по 5
вот файл:
Миниатюры
Считывание с txt и запись в ado  
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 11:53  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Или, может быть, поля разделены не пробелами, а табуляцией?
ничего такого в файле не наблюдается? Или полный хаос?
просто разделены произвольным количеством пробелов.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.11.2014, 11:56
P.S. Samrisbe, а вы этот файл создаете изначально или он вам дан откуда-то? Можно сразу прям и второго зайца прихлопнуть.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
28.11.2014, 12:02  [ТС]
Цитата Сообщение от SatanaXIII Посмотреть сообщение
P.S. Samrisbe, а вы этот файл создаете изначально или он вам дан откуда-то?
Приходит именно в таком виде и я его немного корректирую я бы даже сказал исправляю орфографические ошибки(на фото файл до корректировки).
0
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 12:05
Цитата Сообщение от Samrisbe Посмотреть сообщение
я его немного корректирую я бы даже сказал исправляю орфографические ошибки
Вручную? Порядка 1000 строк? Жестоко...
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.11.2014, 12:12
Samrisbe, если вы кстати пишете софт, то надо учесть этот момент. Вдруг поменяется формат столбцов, все дела. Но это только при условии, если вы не планируете в дальнейшем сопровождать эту программу. Лезть руками в код каждый раз, когда изменится один пробел это худо.

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
Вручную? Порядка 1000 строк? Жестоко...
У вас на аватарке кот играющий на гуслях. И вы еще говорите о жестокости? Х)))

0
Модератор
 Аватар для D1973
9917 / 6454 / 2455
Регистрация: 21.01.2014
Сообщений: 27,389
Записей в блоге: 3
28.11.2014, 12:24

Не по теме:

SatanaXIII, жестокость по отношению к коту или к окружающим, кто его слушает?


Samrisbe, Вы в курсе, откуда получается этот файл? Может быть, есть возможность ограничить кавычками потенциально небезопасные поля типа "ФИО" или "Адрес"?
0
28.11.2014, 12:28

Не по теме:

D1973, короче понеслась. Сейчас мы научим Samrisbe получать файлы. Х)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2014, 12:28
Помогаю со студенческими работами здесь

Считывание и запись в COM порт
Есть код на стороне Ардуины, он работает, с ним всё порядке: boolean dataReady = 0; char incomingChar; char typeMessage; String...

Считывание данных с базы и запись в Label
Подскажите такой вопрос: куда написать вот этот код(его мне тоже тут подсказали): int i = 1; Form3-&gt;ADOTable1-&gt;First(); ...

Считывание ячеек из StringGrid и запись их в динамический массив C++
Доброго времени суток! Совсем недавно начал осваивать Builder C++ и сам синтаксис языка плюсов (до этого изучал Си). Мне необходимо...

Запись txt файла в AnsiString
Подскажите как можно записать txt файл в AnsiString.

Запись в StringGrid из .txt файла
Привет. Подскажите как решить сложившуюся проблему. Решение проблемы понятно, но с реализацией... В текстовом файле записана структура. В...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru