4

ifstream を使用してテキスト ファイルの形式でテーブルを解析し、各エントリを評価/操作しようとしています。しかし、特定のアイテムの省略のために、これにアプローチする方法を理解するのに苦労しています. 次の表を検討してください。

NEW  VER  ID   NAME
1    2a   4    "ITEM ONE" (2001)
     1    7    "2 ITEM" (2002) {OCT}
     1.1  10   "SOME ITEM 3" (2003)
1         12   "DIFFERENT ITEM 4" (2004)
1    a4   16   "ITEM5" (2005) {DEC}

ご覧のとおり、「NEW」列に何もない場合があります。私がやりたいことは、ID、名前、年 (括弧内) をメモし、その後に中括弧があるかどうかをメモすることです。

これをやり始めて「分割」機能を探していたのですが、前述の項目の欠落やタイトルがバラバラになってしまうなど、ちょっと複雑だなと思いました。

私が考えることができる唯一のことは、私が見た最新の数を追跡しながら、各行を単語ごとに読むことです. 引用符を打ったら、最後に見た番号が ID (分割のようなものを使用した場合は、引用符の直前の配列位置) であることに注意してください。次に、次の引用 (タイトル) まですべてを記録します。 、そして最後に、他の情報のために括弧と中括弧を探し始めます。ただし、これは非常に原始的なようで、これを行うためのより良い方法を探しています。

私は C++ のスキルを磨き、より大きな既存のデータセットを操作するためにこれを行っているので、可能であれば C++ を使用したいのですが、別の言語 (Perl または Python を検討しています) でこれが簡単にできる場合は、異なる言語と C++ とのインターフェイスの方法を学ぶだけです。私が今やろうとしているのは、最終的に C++ のオブジェクトになるデータをふるいにかけることです。そのため、C++ のスキルを向上させるチャンスがまだあります。

編集:これは正規表現のみを使用して完了することが可能であることも認識していますが、可能であれば、ファイル/文字列操作のさまざまな方法を使用してみたいと思います。

4

2 に答える 2

6

列オフセットが完全に固定されている場合 (タブがなく、 0x20 の真のスペース文字のみ)、一度に 1 行ずつ読み取り ( string::getline)、固定オフセットを使用して 4 つの文字列のセットに分割します ( string::substr)。

次に、必要に応じて文字列の各 4 タプルを後処理します。

オフセットをハードコーディングせず、SQL Server や他の DB のテーブル記述のように、入力の形式を記述する別の入力ファイルに保存します。

于 2010-11-08T20:12:20.307 に答える
0

このようなもの:

  1. 最初の行を読み、を見つけ"ID"て、インデックスを保存します。
  2. を使用して各データ行を読み取りますstd::getline()
  3. "ID"ヘッダー行で見つけたインデックスから始めて、データ行からサブストリングを作成します。これを使用して、を初期化std::istringstreamします。
  4. を使用してIDを読み取りますiss >> an_int
  5. 最初のを検索し"ます。2番目を検索し"ます。を検索し、(そのインデックスを覚えておいてください。を検索して)、そのインデックスも覚えておいてください。これらのインデックスの間にある文字からサブストリングを作成し、それを使用して別のインデックスを初期化std::istringstreamします。このストリームから番号を読み取ります。
  6. 中かっこを検索します。
于 2010-11-08T20:23:43.787 に答える