Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
nikkk
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 58
#1

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

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

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

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

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

Внешняя сортировка файла: строки матрицы расположить по возрастанию элементов побочной диагонали
работает, но что то с ней не так, подскажите В текстовом файле задана...

Внешняя сортировка
Здравствуйте, уважаемые форумчане! Есть несколько вопросов по заданию моей...

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

Внешняя сортировка
Подскажите, если не сложно как лучше реализовать внешнюю сортировку с 10...

7
SherHun
30 / 30 / 22
Регистрация: 22.06.2015
Сообщений: 102
29.06.2015, 13:32 #2
отсортировать файл с таблицей
Загрузить в массив и отсортировать.
0
nikkk
0 / 0 / 2
Регистрация: 09.10.2014
Сообщений: 58
29.06.2015, 13:42  [ТС] #3
SherHun, Внешняяя....
Если файл несколько гигабайт, неужели все в массив загружать?
0
SherHun
30 / 30 / 22
Регистрация: 22.06.2015
Сообщений: 102
29.06.2015, 13:45 #4
Зачем тогда С++ ?
Лучше тогда с каким нибудь MS Excel работать .
0
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
29.06.2015, 13:49 #5
1. Грузишь в память порциями по N строк, сортируешь, пишешь порцию в свой файл.
2. Сливаешь файлы в один.
1
nikkk
0 / 0 / 2
Регистрация: 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
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
29.06.2015, 17:00 #7
тогда тебе придется каждый раз пробегаться по всему файлу, ища наименьший элемент,
следующей итерацией пробегаешь опять по всему файлу , но отправной точкой поиска наименьшего элемента будет последнее сохраненное значение

весь файл не грузишь, читаешь 1 ячейку, сравниваешь с текущим наименьшим, удаляешь из памяти, читаешь следующую, можно и кусками побольше, главное за каждый проход прочитать файл от начала до конца
1
nikkk
0 / 0 / 2
Регистрация: 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 файла
Считываю .csv файл. ifstream in(&quot;test.csv&quot;); string line, field; ...

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

Чтение из csv файла с обработкой данных
Есть файл вида: n,timestamp,latitude,longitude,speed...


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

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

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