Я прихожу сюда уже много лет, и я всегда находил предыдущие вопросы или темы, которые могли бы мне помочь, но сегодня я не могу найти ответ на свою проблему, поэтому я написал свой первый вопрос.
У меня есть документ .csv со следующим макетом.
Ячейка А1: Title1, Заголовок 2, TITLE3, …
CELL A2: Дата1, Name1, Данные11, Data12, Data13, …
Клетка A3: Дата2, Name2, Data21, Data22, Data23, …
Мне нужно извлечь определенный набор столбцов, а также строки с определенным именем (еще не включены в представленный код).
Проблема в том, что в первой ячейке эти строки текста записываются парами, в то время как все они должны иметь свою собственную строку. Я пытался писать в .txt файлы, и никаких проблем не было найдено. Выглядит так:
Ряд 1: A: Название 1 B: Название 2 C: Название 3 …
Строка 2: A: Дата1, Имя1, Данные11, Данные12, Данные13, Дата2 B: Имя2 C: Данные21 D: Данные22 …
Мой CSV использует точку с запятой («;») в качестве разделителя.
Это код до сих пор (я пытался переместить как можно больше бесполезного контента):
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
//Name of the rooms to be extracted
char *row2keep[] = {"Name1","Name2"};
//Number of the rows to be extracted
int col2keep[] = {1,2,3,4,5};
ifstream data("Nameoffile.csv");
string line;
string cell;
int col = 0;
int row = 0;
ofstream outdata;
outdata.open("sorting.csv", ios::app);
while(getline(data,line)){
col = 0;
row ++;
stringstream lineStream(line);
while(getline(lineStream,cell,',')){
col ++;
for(int c = 0; c < 5; ++c){
if(col2keep[c] == col){
replace(cell.begin(),cell.end(),'.',',');
cout << cell << ";";
outdata << cell << ";";
}
}
}
cout << "\n";
outdata << "\n";
}
data.close();
outdata.close();
return 0;
}
Кажется, проблема в том, что цикл for () в последнем цикле while () каким-то образом портится с ofstream, потому что когда я его удаляю, все восемь строк оказываются одна за другой в разных строках без проблем.
Задача ещё не решена.
Других решений пока нет …