次の行を含む Microsoft Excel 2007 からエクスポートされた csv ファイルがあります。
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
2;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
000055555;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
5;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
20;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8
このライブラリを使用してファイルを解析しましたが、いくつかの問題が発生しました。
- 空行があると、プログラムがクラッシュします。
- 空のフィールドがある場合、プログラムもクラッシュします。
;12;25;25;8;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8 // will crash 20;12;25;25;;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8 // will crash 20;12;25;25; ;3;1;10;3;1;10;3;1;10;3;1;10;12;8;8 // putting a space in empty field to help parser to not crash
簡単なプログラム:
#include <iostream>
#include <fstream>
#include <string>
#include "csv_parser.h"
#include <cstdio>
#define FMT "%-20.20s%-12.12s%-25.25s%-25.25s%-8.8s%-3.3s%-1.1s%-10.10s%-3.3s%-1.1s%-10.10s%-3.3s%-1.1s%-10.10s%-3.3s%-1.1s%-10.10s%-12.12s%-8.8s%-8.8s\n"
using namespace std;
int main(int argc, char **argv)
{
std::string sCol1, sCol2, sCol3, sCol4, sCol5, sCol6, sCol7, sCol8, sCol9, sCol10, sCol11, sCol12, sCol13, sCol14, sCol15, sCol16, sCol17, sCol18, sCol19, sCol20;
const char * filename = "Book2.csv";
const char field_terminator = ';';
const char line_terminator = '\n';
const char enclosure_char = '"';
csv_parser file_parser;
/* Specify the file to parse */
file_parser.init(filename);
/* Here we tell the parser how to parse the file */
file_parser.set_enclosed_char(enclosure_char, ENCLOSURE_OPTIONAL);
file_parser.set_field_term_char(field_terminator);
file_parser.set_line_term_char(line_terminator);
unsigned int row_count = 1U;
FILE *hFile = fopen("Book2.txt", "w");
/* Check to see if there are more records, then grab each row one at a time */
while(file_parser.has_more_rows())
{
unsigned int i = 0;
/* Get the record */
csv_row row = file_parser.get_row();
fprintf(hFile, FMT, row[0].c_str(), row[1].c_str(), row[2].c_str(), row[3].c_str(), row[4].c_str(), row[5].c_str(), row[6].c_str(), row[7].c_str(), row[8].c_str(), row[9].c_str(), row[10].c_str(), row[11].c_str(), row[12].c_str(), row[13].c_str(), row[14].c_str(), row[15].c_str(), row[16].c_str(), row[17].c_str(), row[18].c_str(), row[19].c_str());
row_count++;
}
fclose(hFile);
return 0;
}
Unix/Linux ではパーサーはうまく機能しますが、Windows ではライブラリが行/フィールドを誤って解析します。フィールド区切り文字としてセミコロンを使用して csv ファイルを解析できるパーサー サポートはありますか。