Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
1

Много маленьких файлов .txt в один и отправка в excel

26.08.2015, 13:31. Просмотров 1146. Ответов 35
Метки нет (Все метки)

Добрый день. Не подскажите , есть папка, в ней текстовые файлы, штук сто. Названия вида 015_08_26
(год_месяц_дата). Возможно ли по кнопке их объединять в один. Отправить потом в EXCEL не проблема наверное, но интересует отправка в EXCEL по заданному диапазону (год_месяц_дата). Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2015, 13:31
Ответы с готовыми решениями:

Есть очень много маленьких текстовых файлов необходимо слить в один файл
Очень много маленьких файлов размером от 500 КБ до 90 МБ. Максимальная длина строки в файлах 80...

Много XML-файлов - импорт данных в один Excel
Добрый вечер! Прошу помочь в следующем вопросе. Имеется папка с несколькими тысячами xml-файлов....

Один большой класс или много маленьких?
Здравствуйте. В программе есть N функций, которые необходимо выполнять друг за другом, но в...

Один длинный Regex или много маленьких?
Пытаюсь сделать мат-фильтр. Ничего кроме регекса к голову не пришло... Вопрос: искать одним...

Чтовыгоднее один большой сайт или много маленьких
Вот скажите новичку что выгоднее будет предположим один сайт раскрученный под много запросов и 300...

35
D1973
Модератор
4418 / 3136 / 1491
Регистрация: 21.01.2014
Сообщений: 13,385
Записей в блоге: 3
Завершенные тесты: 1
26.08.2015, 16:26 2
Формат файла?
1
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
26.08.2015, 16:35  [ТС] 3
Цитата Сообщение от D1973 Посмотреть сообщение
Формат файла?
Тоже .txt видимо.
0
nick42
Практикантроп
4451 / 2418 / 437
Регистрация: 23.09.2011
Сообщений: 5,183
26.08.2015, 16:46 4
Я вижу здесь по крайней мере четыре этапа: получение списка файлов папки; преобразование имён в тип DateTime; отбор этих типов по заданному промежутку; обратное преобразование и подгрузка в стринглист (они неплохо объединяются) и потом - отправка этого списка в эксель.
1
26.08.2015, 16:46
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
26.08.2015, 16:54  [ТС] 5
Я тоже примерно такой алгоритм представлял, но
Цитата Сообщение от nick42 Посмотреть сообщение
получение списка файлов папки; преобразование имён в тип DateTime
никак не найти реализацию. особенно первое.
0
D1973
Модератор
4418 / 3136 / 1491
Регистрация: 21.01.2014
Сообщений: 13,385
Записей в блоге: 3
Завершенные тесты: 1
26.08.2015, 17:58 6
Sergey_03, под форматом файла подразумевается его внутренняя структура. Какие данные, как расположены, чем разделяются. А то, что они текстовые, было понятно из задания.
Цитата Сообщение от Sergey_03 Посмотреть сообщение
в ней текстовые файлы
1
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
26.08.2015, 18:22  [ТС] 7
вот пример строки в файле, остальные аналогично, только различное количество строк - может быть одна, а может и 500
------------------------------------------------------------
3 : 12/08/2015/ 10:43:15 Panel 1ALARM Loop 1 Adr: 10 1 Тревога СПР на АПЦ37
-------------------------------------------------------------
Начал такое, двигаюсь дальше
C++
1
2
3
4
FileListBox1->Directory="C:\\Program Files\\Monitoring";
        FileListBox1->Mask = "*.txt ";
        for (int n = 0; n <FileListBox1->Count; n++)
  ListBox1->Items->Add(FileListBox1->Items->Strings[n]);
дальшн думаю из каждого названия путем сортировки стринг формировать стринги даты, месяца и года и и сравнивая их с условием в цикле загонять эти файлы в эксель, красить и все такое...не знаю правильно это все? может что то оптимальнее есть?
0
D1973
Модератор
4418 / 3136 / 1491
Регистрация: 21.01.2014
Сообщений: 13,385
Записей в блоге: 3
Завершенные тесты: 1
26.08.2015, 18:33 8
Ну, для начала неплохо обратить внимание на функции FindFirst / FindNext

Добавлено через 2 минуты
А в Екселе как эта строчка должна по ячейкам разбиваться?
1
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
27445 / 18375 / 7273
Регистрация: 22.10.2011
Сообщений: 32,335
Записей в блоге: 6
26.08.2015, 18:33 9
Как задается нужный диапазон дат, для которого нужно объединить текстовые файлы? В виде TDateTime (начало/конец)?
1
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
26.08.2015, 18:36  [ТС] 10
Цитата Сообщение от D1973 Посмотреть сообщение
А в Екселе как эта строчка должна по ячейкам разбиватьс
я думаю, что и разбивать то не обязязательно - всю в первый столбик, только ширину бы подстроить автоматом.
Цитата Сообщение от volvo Посмотреть сообщение
В виде TDateTime (начало/конец)?
В идеале конечно хотелось бы так. Но так,как умишка мало - думал по эдитам както
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
27445 / 18375 / 7273
Регистрация: 22.10.2011
Сообщений: 32,335
Записей в блоге: 6
26.08.2015, 18:40 11
Проверь, есть у тебя возможность использовать #include <IOUtils.hpp>, или нет. Где-то на 2009-ом Билдере есть, где-то, говорят, нету. Если есть - я накидаю тебе образец выбора только тех файлов из папки, которые находятся в интервале между заданными значениями TDateTime.
1
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
26.08.2015, 21:18  [ТС] 12
Цитата Сообщение от volvo Посмотреть сообщение
использовать #include <IOUtils.hpp>
Спасибо, но такого нет к сожалению.

Добавлено через 2 часа 30 минут
А как вообще отправить правильно строки из .txt в эксель? Чего то пробую - как то сложно получается.
0
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
28.08.2015, 02:33  [ТС] 13
Вообщем как то так сделал - буду пытаться доводить
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
SaveDialog1->Filter = "data files (*.xls)|*.xls";
if (SaveDialog1->Execute())
    {
       ListBox1->Items->Clear();
 
       FileListBox1->Directory="C:\\Program Files\\Monitoring";
       FileListBox1->Mask = "*.txt ";
 
       String SDateMin= DateToStr(Form1->DateTimePicker1->Date);
       String SDateMax= DateToStr(Form1->DateTimePicker2->Date);
 
       String DMYMin="";DMYMin+=SDateMin[9];DMYMin+=SDateMin[10];
                 DMYMin+=SDateMin[4];DMYMin+=SDateMin[5];
                 DMYMin+=SDateMin[1];DMYMin+=SDateMin[2];
       String DMYMax="";DMYMax+=SDateMax[9];DMYMax+=SDateMax[10];
                 DMYMax+=SDateMax[4];DMYMax+=SDateMax[5];
                 DMYMax+=SDateMax[1];DMYMax+=SDateMax[2];
 
       for (int n = 0; n <FileListBox1->Count; n++)
           {
                String DMYStr=FileListBox1->Items->Strings[n];
                String DMY=L"";DMY+=DMYStr[2];DMY+=DMYStr[3];
                DMY+=DMYStr[5];DMY+=DMYStr[6];DMY+=DMYStr[8];DMY+=DMYStr[9];
                if(atoi(DMY.c_str())>=atoi(DMYMin.c_str())&&
                        atoi(DMY.c_str())<=atoi(DMYMax.c_str()))
                    {
                        ListBox1->Items->Add(FileListBox1->Items->Strings[n]);
                    }
           }
        Variant app, books, book, sheet;
        app = CreateOleObject("Excel.Application");
        books = app.OlePropertyGet("Workbooks");
        books.OleFunction("Open", WideString(SaveDialog1->FileName));
        book = books.OlePropertyGet("item", 1);
        sheet = book.OlePropertyGet("WorkSheets", 1);
        Variant Cell;
        int k=1;
        for (int t = 0; t <ListBox1->Count; t++)
           {
                String fn = ListBox1->Items->Strings[t];
                if(FileExists(fn))
                    {
                        std::auto_ptr<TStringList> lst(new TStringList());
                        lst->LoadFromFile(fn, TEncoding::UTF8);
                        int row = 0;
                        for(int i = 0; i < lst->Count; i++)
                            {
                                Cell = sheet.OlePropertyGet("Cells", k, 1);
                                Cell.OlePropertySet("Value",
                                WideString(lst->Strings[i]));
                                k++;
                            }
                    }
            }
        book.OleProcedure("Save");
        app.OleProcedure("Quit");
        app.Clear();
        app=NULL;
    }
0
nick42
Практикантроп
4451 / 2418 / 437
Регистрация: 23.09.2011
Сообщений: 5,183
28.08.2015, 09:34 14
Цитата Сообщение от Sergey_03 Посмотреть сообщение
C++
1
2
3
4
5
6
Variant app, books, book, sheet;
app = CreateOleObject("Excel.Application");
books = app.OlePropertyGet("Workbooks");
books.OleFunction("Open", WideString(SaveDialog1->FileName));
book = books.OlePropertyGet("item", 1);
sheet = book.OlePropertyGet("WorkSheets", 1);
- Данный фрагмент у меня не работает, кстати. Работает в таком варианте:
C++
1
2
3
4
5
6
  Variant app, books, book, sheet, item;
  app = CreateOleObject("Excel.Application");
  books = app.OlePropertyGet("Workbooks");
  book = books.OleFunction("Open", WideString(SaveDialog1->FileName));
  sheet = book.OlePropertyGet("WorkSheets");
  item = sheet.OlePropertyGet("Item", 1);
И в цикле далее item, а не sheet.
1
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
28.08.2015, 09:36  [ТС] 15
Цитата Сообщение от nick42 Посмотреть сообщение
Данный фрагмент у меня не работает, кстати
Да, спасибо, у меня тоже не работает. работает ,только если файл excel для сохранения уже есть. Запутался с этим ОЛЕ
0
nick42
Практикантроп
4451 / 2418 / 437
Регистрация: 23.09.2011
Сообщений: 5,183
28.08.2015, 09:48 16
а для этого нужно сперва применить create, потом open.
1
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
28.08.2015, 09:50  [ТС] 17
Нет, все равно не хочет создавать файл - пишет только в уже созданный. Если ввести имя руками в SaveDialog-
ошибка в ComObj
raise EOleSysError.Create('', ErrorCode, 0);
В чем трабл?

Добавлено через 26 секунд
Цитата Сообщение от nick42 Посмотреть сообщение
а для этого нужно сперва применить create, потом open.
во. огромное спасибо! Совсем забыл. опен диалог надо.
0
D1973
Модератор
4418 / 3136 / 1491
Регистрация: 21.01.2014
Сообщений: 13,385
Записей в блоге: 3
Завершенные тесты: 1
28.08.2015, 09:54 18
Sergey_03, я бы сделал как-то так...
Есть папка (у меня в примере C:\TMP\Monitor), в ней много файлов с маской имени yyy_mm_dd.txt (например 015_08_20.txt). В программе выбирается начальная и конечные даты интервала и по нажатии кнопки в папке с exe-шником формируется файл report.xls
*.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    TDateTimePicker *DateTimePicker1;
    TDateTimePicker *DateTimePicker2;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
    TDate __fastcall DT_From_FN(String); //<<== Вот это добавить
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};

*.cpp
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<TStringList> lst(new TStringList());
  std::auto_ptr<TStringList> list_tmp(new TStringList());
  std::auto_ptr<TStringList> list_all(new TStringList());
  String fDt;
  System::ChDir(L"C:\\TMP\\Monitor");
  TSearchRec SR;
  for(int r = FindFirst("*.txt", faAnyFile, SR); !r; r = FindNext(SR))
   {
      fDt = "2" + SR.Name.SubString(1, SR.Name.Length() - 4);
      if((DT_From_FN(fDt) >= DateTimePicker1->Date) && (DT_From_FN(fDt) <= DateTimePicker2->Date))
        lst->Add(SR.Name);
   }
  FindClose(SR);
  for(int i = 0; i < lst->Count; i++)
   {
     fDt = "2" + lst->Strings[i].SubString(1, lst->Strings[i].Length() - 4);
     list_tmp->LoadFromFile(lst->Strings[i]);
     list_all->Add(fDt);
     for(int j = 0; j < list_tmp->Count; j++)
       list_all->Add(list_tmp->Strings[j]);
   }
  System::ChDir(ExtractFilePath(ParamStr(0)));
  Variant app, books, book, sheet, Cell;
  String Name = ExtractFilePath(ParamStr(0)) + "report.xls";
  app = CreateOleObject("Excel.Application");
  books = app.OlePropertyGet("Workbooks");
  books.OleProcedure("Add");
  book = books.OlePropertyGet("item", 1);
  sheet = book.OlePropertyGet("WorkSheets", 1);
  int k=1;
  for(int i = 0; i < list_all->Count; i++)
   {
     Cell = sheet.OlePropertyGet("Cells", k, 1);
     Cell.OlePropertySet("Value", WideString(list_all->Strings[i]));
     k++;
   }
  sheet.OlePropertyGet("Cells", 1, 1).OlePropertyGet("EntireColumn").OleFunction("AutoFit");
  app.OlePropertySet("DisplayAlerts",false);
  book.OleProcedure("SaveAs", WideString(Name));
  app.OleProcedure("Quit");
  ShowMessage("Готово");
  FormatSettings.ShortDateFormat = "dd.mm.yyyy";
}
//---------------------------------------------------------------------------
TDate __fastcall TForm1::DT_From_FN(String fn)
{
  FormatSettings.DateSeparator = '_';
  FormatSettings.ShortDateFormat = "yyyy_mm_dd";
  TDate Dt;
  if(TryStrToDate(fn, Dt)) return Dt; else return Date();
}
//---------------------------------------------------------------------------
2
Миниатюры
Много маленьких файлов .txt в один и отправка в excel   Много маленьких файлов .txt в один и отправка в excel  
Изображения
 
Sergey_03
20 / 8 / 4
Регистрация: 15.12.2014
Сообщений: 620
28.08.2015, 10:46  [ТС] 19
Спасибо!
0
nick42
Практикантроп
4451 / 2418 / 437
Регистрация: 23.09.2011
Сообщений: 5,183
28.08.2015, 10:53 20
Цитата Сообщение от Sergey_03 Посмотреть сообщение
забыл. опен диалог надо.
- yне обязательно. D1973 подсказал вариант. Вот пример записи нескольких строк из StringGrid1 в новый файл__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::Button1Click(TObject *Sender)
{                                            
    if(SaveDialog1->Execute() )  {
   Variant app, books, book, sheet, cell;
   app = CreateOleObject("Excel.Application");
   books = app.OlePropertyGet("Workbooks");
   books.OleProcedure("Add");
   book = books.OlePropertyGet("item", 1);
   sheet = book.OlePropertyGet("WorkSheets", 1);
    for (int r = 0; r < StringGrid1->RowCount; r++)
      for (int c = 0; c < StringGrid1->ColCount; c++) {
        cell = sheet.OlePropertyGet("Cells", r + 1, c + 1);
        cell.OlePropertySet("Value", WideString(StringGrid1->Cells[c][r]));
      }
   sheet.OlePropertyGet("Cells", 1, 1).OlePropertyGet(
      "EntireColumn").OleFunction("AutoFit");
   app.OlePropertySet("DisplayAlerts",false);
   book.OleProcedure("SaveAs",SaveDialog1->FileName);
   app.OleProcedure("Quit"); 
   app.Clear(); app=NULL;
   }
}
Добавлено через 3 минуты
П.С. в опциях диалога флаг CreatePrompt изменить на true.
1
28.08.2015, 10:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2015, 10:53

Разделить файл txt на несколько равных маленьких файлов
Пожалуйста помогите. Есть большой txt там 1335478 символов Как сделать чтоб он создал папку а в...

Разбить один m-файл на кучу маленьких m-файлов
Здравствуйте. Я не новичок в Matlab. Однако просто раньше такого не требовалось. У меня ну просто...

Запрос данных из БД. Один большой запрос или много маленьких?
Есть основная форма, на которой расположен TreeView, содержащий щас 30 ветвей. По щелчке на ветке...


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

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

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