1

CSV ファイル内の特定のヘッダー値のインデックスを見つけようとしているので、それらを使用してファイルの残りの位置にあるデータを抽出できます。map<std::string, int>インデックスを保持できるように、ヘッダー値を に追加しています。

ヘッダーが行の最後の値である場合、一致しないことに気付くまで、作業コードがありました。ネストされたループ内では最後のヘッダー文字列が空ですが、外側のループではありません。

const int columnCount = 2;
std::string columns[columnCount] = { "column1", "column2" };

map<std::string, int> columnMap;

std::vector<std::string> cols(columns, columns + columnCount);
std::vector<std::string> cells;

boost::tokenizer<boost::escaped_list_separator<char> > tok(header_row);
cells.assign(tok.begin(), tok.end());

std::vector<std::string>::iterator iter_cells;
std::vector<std::string>::iterator iter_cols;

for (iter_cells = cells.begin(); iter_cells != cells.end(); ++iter_cells) {
    std::string cell = *iter_cells; 
    for(iter_cols = cols.begin(); iter_cols != cols.end(); ++iter_cols) {
        std::string col = *iter_cols;
        cout << cell << "=" << col;
        if(col.compare(cell) == 0) {
            cout << " MATCH" << endl;
            columnMap.insert(std::make_pair(*iter_cols,iter_cells-cells.begin()));
            break;
        }
        cout << endl;
    }
}

は、 I get this output; と同等tok(row)です。tok("column0,column1,column2")

column0=column1
column0=column2
column1=column1 MATCH
=column1
=column2

それがtok("column0,column1,column2,column3")私が得るなら一方。

column0=column1
column0=column2
column1=column1 MATCH
column2=column1
column2=column2 MATCH
=column1
=column2

外側のループにcout << cellいると、値が正しく表示されます。

cell内側のループでの値を失うのはなぜですか?

編集

githubおよびテスト ファイル内のコードは、次のようにコンパイルされます。

gcc parse_csv.cpp -o parse_csv -lboost_filesystem -lmysqlpp

で実行されます

./parse_csv /home/dave/SO_Q/

この出力が得られます。

Process File: /home/dave/SO_Q/test_2.csv
metTime
metTime=metTime MATCH
Ta
=metTime
=Ta
=Ua
=Th
Process File: /home/dave/SO_Q/test_1.csv
DATE_TIME_UTC
DATE_TIME_UTC=metTime
DATE_TIME_UTC=Ta
DATE_TIME_UTC=Ua
DATE_TIME_UTC=Th
Ta
Ta=metTime
Ta=Ta MATCH
metTime
=metTime
=TaTime
=UaTime
=ThTime
4

2 に答える 2

0

変数「header_row」にどのようにデータを入力しているかはわかりませんが、以下のコードが機能します。この出力が得られます

列0=列1

列0=列2

column1=column1 マッチ

列2=列1

column2=column2 マッチ

列3=列1

列3=列2

#include  <boost/tokenizer.hpp>
#include <iostream>
#include <fstream>
#include <map>

using namespace std;



int main()
{
  //create csv
  ofstream csvFile ("data.csv");
  std::string row = "column0,column1,column2,column3";

  csvFile << row;

  csvFile.close();

  const int columnCount = 2;
  std::string columns[columnCount] = { "column1", "column2" };

  map<std::string, int> columnMap;

  std::vector<std::string> cols(columns, columns + columnCount);
  std::vector<std::string> cells;

  //open csv file
  std::string header_row;
  ifstream csvRead("data.csv");
  assert(csvRead.is_open());
  getline(csvRead,header_row);

  boost::tokenizer<boost::escaped_list_separator<char> > tok(header_row);
  cells.assign(tok.begin(), tok.end());
  //close file
  csvRead.close();

  std::vector<std::string>::iterator iter_cells;
  std::vector<std::string>::iterator iter_cols;
  
 //original loops as provided in question
  for (iter_cells = cells.begin(); iter_cells != cells.end(); ++iter_cells) {
    std::string cell = *iter_cells;
    for(iter_cols = cols.begin(); iter_cols != cols.end(); ++iter_cols) {
      std::string col = *iter_cols;
      cout << cell << "=" << col;
      if(col.compare(cell) == 0) {
        cout << " MATCH" << endl;
        columnMap.insert(std::make_pair(*iter_cols,iter_cells-cells.begin()));
        break;
      }
      cout << endl;
    }
  }

}
于 2013-11-22T07:17:05.377 に答える
0

問題は、ヘッダー行の入力にありました。これには、配列内の項目と一致しない改行が最後に含まれていました。改行を削除すると、問題が修正されました。

私は Windows PC で作業していて、ファイルを Cent OS マシンに転送してコードを実行しましたが、2 つのプラットフォーム間の行末の違いが問題の原因でした。

これをデバッグ ステートメントとして使用するcout << cellと、文字列が表示され、改行が無視されます。次のようなものを使用するcout << cell << " CELL"と、改行のために文字列が表示されませんでした。

これをコードに追加して、改行の違いをキャッチしました

// remove possible windows line ending so last item matches
if(header_row[header_row.length()-1] == '\r') {
    header_row.erase(header_row.size()-1);
}
于 2013-11-24T22:35:02.090 に答える