Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nikkk
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 58
#1

Внешняя сортировка (файла *.csv) в С++ - C++

29.06.2015, 13:29. Просмотров 768. Ответов 7
Метки нет (Все метки)

Здравствуйте! Мучаюсь с внешней сортировкой. Есть задача - отсортировать файл с таблицей (*.csv) по какому-либо полю. Сам способ слияния я более менее уловил, но как при этом работать с файлом я не могу понять. Может кто-нибудь поделиться ссылкой на полезную литературу, или решение похожих задач?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2015, 13:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Внешняя сортировка (файла *.csv) в С++ (C++):

Внешняя сортировка (из файла) - C++
Помогите написать программу!! Последняя лабораторная осталась!!))) Сама по себе программа не тяжелая, а вот проблема с внешней...

Сортировка csv файла по столбцу - C++
Собственно задача: есть csv файл(открывал с помощью экселя) как с ним вообще работать? Как удалить что-то ненужное или отсортировать по...

Внешняя сортировка - C++
Подскажите, как реализовать внещную сортировку массива?

Внешняя сортировка - C++
Здравствуйте!) Прочёл статью на хабре (https://habrahabr.ru/post/268535/) про внешнюю сортировку. Хотелось бы узнать насколько вообще...

Внешняя сортировка - C++
Подскажите, если не сложно как лучше реализовать внешнюю сортировку с 10 файлами для чисел?

Внешняя сортировка - C++
Здравствуйте, уважаемые форумчане! Есть несколько вопросов по заданию моей курсовой. Надеюсь получить советы/помощь от Вас. Собственно...

7
SherHun
29 / 29 / 15
Регистрация: 22.06.2015
Сообщений: 102
29.06.2015, 13:32 #2
отсортировать файл с таблицей
Загрузить в массив и отсортировать.
0
nikkk
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 58
29.06.2015, 13:42  [ТС] #3
SherHun, Внешняяя....
Если файл несколько гигабайт, неужели все в массив загружать?
0
SherHun
29 / 29 / 15
Регистрация: 22.06.2015
Сообщений: 102
29.06.2015, 13:45 #4
Зачем тогда С++ ?
Лучше тогда с каким нибудь MS Excel работать .
0
zer0mail
2393 / 2025 / 201
Регистрация: 03.07.2012
Сообщений: 7,341
Записей в блоге: 1
29.06.2015, 13:49 #5
1. Грузишь в память порциями по N строк, сортируешь, пишешь порцию в свой файл.
2. Сливаешь файлы в один.
1
nikkk
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 58
29.06.2015, 16:46  [ТС] #6
Еще вопрос по прямой сортировке Допустим у меня есть два вспомогательных файла
с отсортированными парами
8,23|33,44
5,65|1,6
Может кто нибудь наставить на путь истинный, как именно эти пары слить?)
Т. е. из двух пар (8,23) (5,65) получить последовательность 5 8 23 65
0
Raali
638 / 342 / 42
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
29.06.2015, 17:00 #7
тогда тебе придется каждый раз пробегаться по всему файлу, ища наименьший элемент,
следующей итерацией пробегаешь опять по всему файлу , но отправной точкой поиска наименьшего элемента будет последнее сохраненное значение

весь файл не грузишь, читаешь 1 ячейку, сравниваешь с текущим наименьшим, удаляешь из памяти, читаешь следующую, можно и кусками побольше, главное за каждый проход прочитать файл от начала до конца
1
nikkk
0 / 0 / 0
Регистрация: 09.10.2014
Сообщений: 58
30.06.2015, 11:14  [ТС] #8
Raali, А можешь код набросать, пожалуйста?)

Добавлено через 17 часов 27 минут
Вопрос немного не по теме, но все же
Есть два алгоритма сортировке. Один использует стандартные сишные функции для работы с файлами, другой QFile. Проблема в том, что первый из них работает, а второй просто удаляет содержимое всего файла. Посмотрите, пожалуйста, в чем ошибка?
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
//Описание функции сортировки простым слиянием
void Simple_Merging_Sort (char *name){
  int a1, a2, k, i, j, kol, tmp;
  FILE *f, *f1, *f2;
  kol = 0;
  if ( (f = fopen(name,"r")) == NULL )
    printf("\nИсходный файл не может быть прочитан...");
  else {
    while ( !feof(f) ) {
      fscanf(f,"%d",&a1);
      kol++;
    }
    fclose(f);
  }
  k = 1;
  while ( k < kol ){
    f = fopen(name,"r");
    f1 = fopen("smsort_1","w");
    f2 = fopen("smsort_2","w");
    if ( !feof(f) ) fscanf(f,"%d",&a1);
    while ( !feof(f) ){
      for ( i = 0; i < k && !feof(f) ; i++ ){
        fprintf(f1,"%d ",a1);
        fscanf(f,"%d",&a1);
      }
      for ( j = 0; j < k && !feof(f) ; j++ ){
        fprintf(f2,"%d ",a1);
        fscanf(f,"%d",&a1);
      }
    }
    fclose(f2);
    fclose(f1);
    fclose(f);
 
    f = fopen(name,"w");
    f1 = fopen("smsort_1","r");
    f2 = fopen("smsort_2","r");
    if ( !feof(f1) ) fscanf(f1,"%d",&a1);
    if ( !feof(f2) ) fscanf(f2,"%d",&a2);
    while ( !feof(f1) && !feof(f2) ){
      i = 0;
      j = 0;
      while ( i < k && j < k && !feof(f1) && !feof(f2) ) {
        if ( a1 < a2 ) {
          fprintf(f,"%d ",a1);
          fscanf(f1,"%d",&a1);
          i++;
        }
        else {
          fprintf(f,"%d ",a2);
          fscanf(f2,"%d",&a2);
          j++;
        }
      }
      while ( i < k && !feof(f1) ) {
        fprintf(f,"%d ",a1);
        fscanf(f1,"%d",&a1);
        i++;
      }
      while ( j < k && !feof(f2) ) {
        fprintf(f,"%d ",a2);
        fscanf(f2,"%d",&a2);
        j++;
      }
    }
    while ( !feof(f1) ) {
      fprintf(f,"%d ",a1);
      fscanf(f1,"%d",&a1);
    }
    while ( !feof(f2) ) {
      fprintf(f,"%d ",a2);
      fscanf(f2,"%d",&a2);
    }
    fclose(f2);
    fclose(f1);
    fclose(f);
    k *= 2;
  }
  remove("smsort_1");
  remove("smsort_2");
}
C++ (Qt)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
void straightSort (){
  int a1, a2, k, i, j, n;
  //FILE *mainFile, *subFile1, *subFile2;
 QFile mainFile("file.csv"), subFile1("subFile1.csv"), subFile2("subFile2.csv");
 
  n = 0;
 // mainFile = fopen(name,"r");
  mainFile.open(QIODevice::ReadOnly);
   // while ( !feof(mainFile) ) {
  while (!mainFile.atEnd()) {
      //fscanf(mainFile,"%d",&a1);
      mainFile.readLine();
      n++;
    }
    //fclose(mainFile);
  mainFile.close();
  k = 1;
  while ( k < n ){
    //mainFile = fopen(name,"r");
    mainFile.open(QIODevice::ReadOnly);
    //subFile1 = fopen("smsort_1","w");
    subFile1.open(QIODevice::WriteOnly | QIODevice::Truncate);
    //subFile2 = fopen("smsort_2","w");
    subFile2.open(QIODevice::WriteOnly | QIODevice::Truncate);
    //if ( !feof(mainFile) ) fscanf(mainFile,"%d",&a1);
    if (!mainFile.atEnd()){
        QString str = mainFile.readLine();
        a1 = str.toInt();
    }
 
    //while ( !feof(mainFile) ){
    while (!mainFile.atEnd()){
     // for ( i = 0; i < k && !feof(mainFile) ; i++ ){
        for ( i = 0; i < k && !mainFile.atEnd() ; i++ ){
        //fprintf(subFile1,"%d ",a1);
        subFile1.write(QString::number(a1).toUtf8());
        subFile1.write("\n");
        //fscanf(mainFile,"%d",&a1);
        QString str = mainFile.readLine();
        a1 = str.toInt();
      }
     // for ( j = 0; j < k && !feof(mainFile) ; j++ ){
        for ( j = 0; j < k && !mainFile.atEnd() ; j++ ){
        //fprintf(subFile2,"%d ",a1);
        subFile2.write(QString::number(a1).toUtf8());
        subFile2.write("\n");
        //fscanf(mainFile,"%d",&a1);
        QString str = mainFile.readLine();
        a1 = str.toInt();
      }
    }
    //fclose(subFile2);
    subFile2.close();
   // fclose(subFile1);
    subFile1.close();
    //fclose(mainFile);
    mainFile.close();
 
    //mainFile = fopen(name,"w");
   mainFile.open(QIODevice::WriteOnly | QIODevice::Truncate);
    //subFile1 = fopen("smsort_1","r");
    subFile1.open(QIODevice::ReadOnly);
    //subFile2 = fopen("smsort_2","r");
    subFile2.open(QIODevice::ReadOnly);
 
    //if ( !feof(subFile1) ) fscanf(subFile1,"%d",&a1);
    if (!subFile1.atEnd()){
        QString str = subFile1.readLine();
        a1 = str.toInt();
    }
 
    //if ( !feof(subFile2) ) fscanf(subFile2,"%d",&a2);
    if (!subFile2.atEnd()){
        QString str = subFile2.readLine();
        a2 = str.toInt();
    }
 
   // while ( !feof(subFile1) && !feof(subFile2) ){
    while (!subFile1.atEnd() && !subFile2.atEnd()) {
      i = 0;  j = 0;
      //while ( i < k && j < k && !feof(subFile1) && !feof(subFile2) ) {
          while ( i < k && j < k && !subFile1.atEnd() && !subFile2.atEnd()) {
 
        if ( a1 < a2 ) {
          //fprintf(mainFile,"%d ",a1);
          mainFile.write(QString::number(a1).toUtf8());
          mainFile.write("\n");
          //fscanf(subFile1,"%d",&a1);
          QString str = subFile1.readLine();
          a1 = str.toInt();
          i++;
        }
        else {
          //fprintf(mainFile,"%d ",a2);
          mainFile.write(QString::number(a2).toUtf8());
          mainFile.write("\n");
          //fscanf(subFile2,"%d",&a2);
          QString str = subFile2.readLine();
          a2 = str.toInt();
          j++;
        }
      }
      //while ( i < k && !feof(subFile1) ) {
        while ( i < k && !subFile1.atEnd() ) {
        //fprintf(mainFile,"%d ",a1);
        mainFile.write(QString::number(a1).toUtf8());
        mainFile.write("\n");
        //fscanf(subFile1,"%d",&a1);
        QString str = subFile1.readLine();
        a1 = str.toInt();
        i++;
      }
     // while ( j < k && !feof(subFile2) ) {
        while ( j < k && !subFile2.atEnd() ) {
       // fprintf(mainFile,"%d ",a2);
        mainFile.write(QString::number(a2).toUtf8());
        mainFile.write("\n");
        //fscanf(subFile2,"%d",&a2);
        QString str = subFile2.readLine();
        a2 = str.toInt();
        j++;
      }
    }
    //while ( !feof(subFile1) ) {
    while (!subFile1.atEnd()) {
     // fprintf(mainFile,"%d ",a1);
      mainFile.write(QString::number(a1).toUtf8());
      mainFile.write("\n");
      //fscanf(subFile1,"%d",&a1);
      QString str = subFile1.readLine();
      a1 = str.toInt();
    }
    //while ( !feof(subFile2) ) {
    while (!subFile2.atEnd()) {
      //fprintf(mainFile,"%d ",a2);
        mainFile.write(QString::number(a2).toUtf8());
        mainFile.write("\n");
      //fscanf(subFile2,"%d",&a2);
        QString str = subFile2.readLine();
        a2 = str.toInt();
    }
    subFile2.close();
    subFile1.close();
    mainFile.close();
    k *= 2;
  }
  //subFile1.remove();
  //subFile2.remove();
}
0
30.06.2015, 11:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2015, 11:14
Привет! Вот еще темы с ответами:

Чтение CSV-файла в двумерный массив - C++
Есть файл вида:Нужно собрать числа в двумерный массив. Количество строк в файле неизвестно. Попробовал использовать регулярные выражения....

Код для парсинга одного столбца с данными из CSV файла ? - C++
Есть .csv файл в нем 6 столбцов разделенных &quot;;&quot;. Нужно импортировать в double 4 столбец из файла. Не могу найти короткий код....

Разработка программы конвертации csv файла в xml структуру данных - C++
Здравствуйте,скажите пожалуйста.реально ли разработать программу конвертации csv файла в xml структуру данных.

Чтение из csv файла в двумерный массив географических координат с нестандартными символами - C++
Добрый вечер! После Hello Word это моя первая прога на с++, поэтому очень прошу помочь. Задача состоит в следующем Есть csv файл,...


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

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

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