#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <locale>
#include <codecvt>
class CSVReader {
public:
CSVReader(const std::string& filename) : filename_(filename) {}
bool ReadCSV(std::vector<std::vector<std::string>>& data) {
std::ifstream file(filename_);
if (!file.is_open()) {
std::cerr << "Failed to open file: " << filename_ << std::endl;
return false;
}
std::string line;
while (std::getline(file, line)) {
// 自動的にエンコーディングを検出して変換
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> utf8_converter;
std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> sjis_converter;
std::wstring wline;
try {
wline = utf8_converter.from_bytes(line);
} catch (const std::exception& e) {
try {
wline = sjis_converter.from_bytes(line);
} catch (const std::exception& e) {
std::cerr << "Failed to convert line to UTF-8 or Shift-JIS: " << e.what() << std::endl;
return false;
}
}
// CSVデータをパースして格納
std::vector<std::string> row;
std::wstring cell;
bool inQuotes = false;
for (wchar_t c : wline) {
if (c == L'"') {
inQuotes = !inQuotes;
} else if (c == L',' && !inQuotes) {
row.push_back(utf8_converter.to_bytes(cell));
cell.clear();
} else {
cell += c;
}
}
row.push_back(utf8_converter.to_bytes(cell));
data.push_back(row);
}
file.close();
return true;
}
private:
std::string filename_;
};
int main() {
std::vector<std::vector<std::string>> csvData;
CSVReader reader("example.csv");
if (reader.ReadCSV(csvData)) {
// データを使って何かを行う
for (const auto& row : csvData) {
for (const auto& cell : row) {
std::cout << cell << "\t";
}
std::cout << std::endl;
}
}
return 0;
}