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

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

28.11.2018, 15:02. Показов 3331. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2018, 15:02
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

Добавлено через 8 минут
nmcf, главное, что я исходник скомпилировал, поместил в папку с csv файлами (пусть макс 90 файлов) и разом программа их переделала в txt/dat в данном каталоге. Это было бы замечательно
0
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
28.11.2018, 18:13
Лучший ответ Сообщение было отмечено 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  [ТС]
igorrr37, Так...понял...спасибо. Буду разбираться или вс2017 установлю. Вроде все понятно, только строка 20 не сильно понял. Можете немного комментариев написать. СПАСИБО!
0
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
28.11.2018, 18:41
Все 30-50-90 файлов из данного подкаталога будут скинуты в один большой txt файл, и в строке 20 формируется имя этого файла как res + имя подкаталога + .txt
1
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
28.11.2018, 19:25  [ТС]
Спасибо за ответ
0
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
29.11.2018, 17:02  [ТС]
igorrr37.


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

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

Заранее спасибо!
0
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
30.11.2018, 10:09
не понятно что значит
Цитата Сообщение от DmiVan Посмотреть сообщение
и без первого столбца (то есть первый файл csv по второму столбцу)
0
30.11.2018, 10:14

Не по теме:

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

0
0 / 0 / 0
Регистрация: 28.11.2018
Сообщений: 9
30.11.2018, 11:07  [ТС]
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
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
30.11.2018, 15:43
Лучший ответ Сообщение было отмечено 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  [ТС]
igorrr37, Igorrr37, здравствуйте.

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

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

Горю.
Буду очень признателен.
Вложения
Тип файла: zip tek0178.zip (84.2 Кб, 6 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2019, 07:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru