Разбор C ++: как я могу распознать несколько разделителей подряд, не пропуская их все одновременно, используя getline, strtok и т. Д.?

По сути, я пытаюсь преобразовать файл .txt в файл .csv. Файл .txt разделен каналами ‘|’, и мне нужно преобразовать каналы в запятые и сделать некоторые другие исключения для существующих запятых ‘,’ и двойных кавычек » ‘.

Тем не менее, основная проблема, с которой я столкнулся, заключается в следующем: файл в формате .txt: |||

Я должен превратить это в: ,,,

Но каждый раз strtok_s всегда превращает эти три канала в одну запятую.

Я пытался понять strtok_s () больше для того, чтобы манипулировать им для моих целей (находится в закомментированном условии if), но мне не очень повезло.

Есть ли способ сделать разбор по-разному, что позволяет мне рассматривать вещи более индивидуально или реализовать условие if с помощью strtok_s ()?

Вот мой код:

const int MAX_CHARS_PER_LINE = 150;
const int MAX_TOKENS_PER_LINE = 15;
const char* const DELIMITER = "|";

int main(){
// Need to comment code and split it up so it's not all in the main function

// Basically just asking for file name stuffs
cout << "Enter an existing input file name: ";
string fileName;
getline(cin, fileName);
fileName = fileName + ".txt";

cout << "Enter an output file name: ";
string output;
getline(cin, output);
output = output + ".csv";

ifstream infile;
ofstream outfile;
infile.open(fileName);
if (!infile){
cout << "File open failure!" << endl;
system("pause");
return 0;
}

outfile.open(output);

//THE MEAT OF THE CODE
while (!infile.eof()){
char buffer[MAX_CHARS_PER_LINE];
infile.getline(buffer, MAX_CHARS_PER_LINE);

int counter = 0;
const char* token[MAX_TOKENS_PER_LINE];
char * next_token;

token[0] = strtok_s(buffer, DELIMITER, &next_token);
if (token[0]){
for (counter = 1; counter < MAX_TOKENS_PER_LINE; counter++){
//if (){                <----- Wtf do I put in the if-condition?
//token[counter] = ",";
//}
//else{
token[counter] = strtok_s(NULL, DELIMITER, &next_token);
//}
if (!token[counter]){ // no more tokens put into the array
break;
}
}
}

//Basically just ignore all this stuff, a lot of tedious exceptions
for (int i = 0; i < counter; i++){
string temp = token[i];
string ultimate = "\"";
if (temp.find('"') != string::npos){
while (temp.find('"') != string::npos){
ultimate += temp.substr(0, temp.find('"'));
ultimate += "\"\"";
temp = temp.substr(temp.find('"') + 1);
}
ultimate += temp;
ultimate += "\"";
outfile << ultimate << ',';
}
else if (temp.find(',') != string::npos){
temp = "\"" + temp + "\"";
outfile << temp << ',';
}
else if (temp.compare(",") == 0){
outfile << temp;
}
else{
outfile << token[i] << ',';
}
}
outfile << endl;
}infile.close();
outfile.close();
system("pause");
return 0;
}

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]