Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
1

Excel много файлов, с++, считывание и запись

28.11.2018, 15:02. Показов 2276. Ответов 15
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане.
Я не сильно силен с работой с файлами в с++. Поэтому, прошу помочь.
Есть задача, которую надо решить: существует порядка 500 однотипных файлов с расширением «csv» [несколько каталогов этих файлов по 30-50-90 файлов с одинаковыми именами, например, в первом каталоге файлы с именами 1.csv-30.csv, во втором каталоге файлы с именами 1.csv-50.csv и так далее].
В каждом файле (эта таблица) заполнен только первый столбец. Строки в этом столбце 1-14 не несут никакой инфы. А вот с 15 строки их надо разделить на два отдельных столбца по разделителю «///» и записать эти два столбца в один файл .txt или .dat с именем файла, с которым идет работа. И если бы программку закинуть в каталог, то она сделала это со всеми файлами сразу.



p.s.: можно это сделать и в экселе, но представляете 500 файлов!
p.p.s: вопрос задаю, потому что форму просмотрел и ничего не нашел.

Помогите, пожалуйста, очень надо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2018, 15:02
Ответы с готовыми решениями:

Запись и считывание файлов
Вот таким кодом записываю и считываю: procedure SaveFile(AFileName, APartName: String; ASource:...

Считывание и запись hex-файлов
Задача состоит в том, чтобы считать с hex-файла(Intel hex) с начала файла до некоторого адреса(не...

Считывание и запись .bmp файлов
Здравствуйте. Помогите, пожалуйста, разобраться почему не работает сохранение bmp файла. ...

Считывание(запись) Excel в(из) массив структур
Добрый день. Подскажите пожалуйста как проще выполнить считывание данных с Excel и записать в...

15
566 / 349 / 132
Регистрация: 15.09.2017
Сообщений: 1,239
28.11.2018, 15:07 2
А вопрос-то в чем заключается?

Добавлено через 2 минуты
И приведите пример содержимого файла
0
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
28.11.2018, 15:55  [ТС] 3
Вопрос с коде на с++, который, например, вставить можно в консольное приложение на билдере, скомпилировать, сделать автономный "exe", поместить его в папку и он в этой папке обработает "csv" файлы разом и сохранит столбец до "///" и столбец после в два отдельных столбца в "txt/dat" с тем же именем. А если можно было бы их все в одной папке объединить в один большой "txt/dat" файл, то было бы превосходно вообще.

Описал подробно как это вижу.

В приложении вид файла.

Спасибо за отклик.
Вложения
Тип файла: zip tek0079.zip (29.2 Кб, 8 просмотров)
0
7158 / 6133 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
28.11.2018, 16:11 4
Записать через пробел, что ли?
1
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
28.11.2018, 17:51  [ТС] 5
Ну да, например, чтобы ориджин нормально считал файл.

Добавлено через 8 минут
nmcf, главное, что я исходник скомпилировал, поместил в папку с csv файлами (пусть макс 90 файлов) и разом программа их переделала в txt/dat в данном каталоге. Это было бы замечательно
0
2229 / 1732 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
28.11.2018, 18:13 6
Лучший ответ Сообщение было отмечено DmiVan как решение

Решение

Не знаю сработает ли в билдере
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
#include <iostream>
#include <fstream>
#include <filesystem>
#include <string>
#include <regex>
#include <iterator>
#include <clocale>
namespace fs = std::experimental::filesystem;
using namespace std::string_literals;
 
// тестилось в MSVS2017
int main()
{
    setlocale(LC_CTYPE, "rus");
    for (fs::recursive_directory_iterator ib{ fs::current_path() }, ie; ib != ie; ++ib) // каталог с подкаталогами (будут обработаны все подкаталоги в этом каталоге)
    {
        if (ib->path().extension() == ".csv")
        {
            std::ifstream ifs(ib->path());
            std::ofstream ofs(ib->path().parent_path() / ("res"s + ib->path().parent_path().filename().string() + ".txt"), std::ios::app);
            if (ifs.is_open() && ofs.is_open())
            {
                std::string str{ std::istreambuf_iterator<char>{ ifs.rdbuf() }, {} };
                str = std::regex_replace(str, std::regex{"^(?:.*?\n){14}"}, "", std::regex_constants::format_first_only); // удаление первых 14 строк
                ofs << std::regex_replace(str, std::regex{ "///" }, ";");
                ifs.close();
                ofs.close();
            }
            else
            {
                std::cerr << "Unable to open file: " + ib->path().string() << std::endl;
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
28.11.2018, 18:32  [ТС] 7
igorrr37, Так...понял...спасибо. Буду разбираться или вс2017 установлю. Вроде все понятно, только строка 20 не сильно понял. Можете немного комментариев написать. СПАСИБО!
0
2229 / 1732 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
28.11.2018, 18:41 8
Все 30-50-90 файлов из данного подкаталога будут скинуты в один большой txt файл, и в строке 20 формируется имя этого файла как res + имя подкаталога + .txt
1
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
28.11.2018, 19:25  [ТС] 9
Спасибо за ответ
0
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
29.11.2018, 17:02  [ТС] 10
igorrr37.


Спасибо еще раз, все отлично. Только я получается не развернуто описал.
Напишите, пожалуйста, строки кода и куда вставить или отредактированный код, что проще, чтобы это писалось в динамическую матрицу и без первого столбца (то есть первый файл csv по второму столбцу), второй файл в папке через пробел как второй столбец матрицы, третий как третий столбец матрицы и так далее (а рандомно удаление столбцов сам сделаю), а не все в один столбец последовательно. И был бы очень признателен, если первой строкой в этой матрице было бы, например, ("каталог откуда" (не полный путь, а местный)_"имя файла в этом каталоге"). Очень поможете.

Заранее спасибо!
0
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
30.11.2018, 09:37  [ТС] 11
igorrr37,
Спасибо еще раз, все отлично. Только я получается не развернуто описал.
Напишите, пожалуйста, строки кода и куда вставить или отредактированный код, что проще, чтобы это писалось в динамическую матрицу и без первого столбца (то есть первый файл csv по второму столбцу), второй файл в папке через пробел как второй столбец матрицы, третий как третий столбец матрицы и так далее (а рандомно удаление столбцов сам сделаю), а не все в один столбец последовательно. И был бы очень признателен, если первой строкой в этой матрице было бы, например, ("каталог откуда" (не полный путь, а местный)_"имя файла в этом каталоге"). Очень поможете.

Заранее спасибо!
0
2229 / 1732 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
30.11.2018, 10:09 12
не понятно что значит
Цитата Сообщение от DmiVan Посмотреть сообщение
и без первого столбца (то есть первый файл csv по второму столбцу)
0
nmcf
30.11.2018, 10:14
  #13

Не по теме:

igorrr37, да он с самого начала не может чётко объяснить.

0
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
30.11.2018, 11:07  [ТС] 14
igorrr37,


Понял, что не все понятно написал.

Кол-во элементов в любом столбце файлов "csv" одинаковое.

Итог будет файл ".txt" (будет представлять собой матрицу кол-во элементов в любом столбце.csv Х кол-во файлов в данном каталоге).

То есть итоговый файл.txt будет выглядеть как матрица: [1 столбец.txt=2 столбец 0001.csv] " " [2 столбец.txt=2 столбец 0002.csv] " " [3 столбец.txt=2 столбец 0003.csv]..." " n столбец.txt=2 столбец 000n.csv.
0
2229 / 1732 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
30.11.2018, 15:43 15
Лучший ответ Сообщение было отмечено DmiVan как решение

Решение

я так понял первый столбец файла .csv не нужен
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
#include <iostream>
#include <fstream>
#include <filesystem>
#include <string>
#include <regex>
#include <iterator>
#include <clocale>
#include <vector>
#include <algorithm>
#include <iomanip>
namespace fs = std::experimental::filesystem;
using namespace std::string_literals;
 
fs::path parentPath;
std::vector<std::vector<std::string>> mtx;
std::regex r2col{ "///(.*?)\n" }, r14row{ "^(?:.*?\n){14}" };
 
// создание файла и сброс матрицы в файл 
void mtxToFile()
{
    fs::path pofs{ parentPath / ("res"s + parentPath.filename().string() + ".txt") };
    std::ofstream ofs(pofs);
    if (ofs.is_open())
    {
        for (auto const& lst : mtx)
        {
            for (auto const& str : lst)
            {
                ofs << std::setw(12)/*ширина столбца*/ << std::left << str;
            }
            ofs << '\n';
        }
        ofs.close();
        mtx.clear();
    }
    else
    {
        std::cerr << "Unable to open output file: " << pofs << std::endl;
    }
}
 
// тестилось в MSVS2017
int main()
{
    setlocale(LC_CTYPE, "rus");
    for (fs::recursive_directory_iterator ib{ fs::current_path() }, ie; ib != ie; ++ib) 
    {
        if (ib->path().extension() == ".csv")
        {
            if (parentPath.empty())
            {
                parentPath = ib->path().parent_path();
            }
            if (ib->path().parent_path() != parentPath)
            {
                mtxToFile();
                parentPath = ib->path().parent_path();
            }
            
            std::ifstream ifs(ib->path());
            if (ifs.is_open())
            {
                std::string sfc{ std::istreambuf_iterator<char>{ ifs.rdbuf() }, {} };
                sfc = std::regex_replace(sfc, r14row, "", std::regex_constants::format_first_only);
                int cntFound = 0;
                if (mtx.size() == 0)
                {
                    mtx.emplace_back();
                }
                mtx.at(0).emplace_back((ib->path().parent_path().filename() / ib->path().filename()).string());
                std::for_each(std::sregex_token_iterator{ sfc.begin(), sfc.end(), r2col, 1 }, {}, [&cntFound](auto const& sm)
                {
                    ++cntFound;
                    if (mtx.size() < cntFound + 1)
                    {
                        mtx.emplace_back();
                    }
                    mtx.at(cntFound).emplace_back(sm.str());
                });
 
                ifs.close();
            }
            else
            {
                std::cerr << "Unable to open input file: " + ib->path().string() << std::endl;
            }
        }
    }
    if (!mtx.empty())
    {
        mtxToFile();
    }
}
1
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
10.01.2019, 07:56  [ТС] 16
igorrr37, Igorrr37, здравствуйте.

Спасибо за помощь. Но после праздников новогодних преподаватель решил усложнить задачу:
есть также файлы .csv (пример файла), но теперь из них надо записать в общий файл каждый второй столбец (то есть которые между "," и ///"). При этом как и раньше первая строка-это название файла, откуда идет запись; вторая строка - это сумма первых N элементов (количество элементов N вводится с запроса с клавиатуры); третья строка-это количество элементов в столбце для каждого столбца, которые больше порогового значения (пороговое значение вводится с клавиатуры для каждого столбца); четвертая строка, пятая строка,...- это столбцы.

И второй файл - это все то же самое, только если после считывания файла .csv для дальнейшей проверки значения в нем нормируются на максимальное значение, то есть максимально найденное значение в каждом столбце будет 1.

Горю.
Буду очень признателен.
Вложения
Тип файла: zip tek0178.zip (84.2 Кб, 6 просмотров)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2019, 07:56

Много маленьких файлов .txt в один и отправка в excel
Добрый день. Не подскажите , есть папка, в ней текстовые файлы, штук сто. Названия вида 015_08_26 ...

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

Считывание/запись ячейки в Excel - LibXL (C, CodeBlocks)
Скачал бесплатную версию библиотеки, установил, пытаюсь проверить простые примеры с главной сайта:...

Считывание данных из текствого файла и запись в EXCEL по столбцам
Добрый день! Подскажите, пожайлуста, как мне сделать средствами Delphi программу, которая будет...


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

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

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