• ベストアンサー

CSVの項目検索について

現在C++を使いはじめて1週間になり、そこで任されたプログラムの一部がわからずに困っています。 概要: ・CSVファイルがありそこの、ある項目列と検索する文字列が一致すれば、一致したレコードを取得するといった部分で煮詰まっています・・・ CSVファイルのサンプル testA,1,200412 testB,2,200410 testC,3,200409 といった感じで、「testA」といった文字列で検索をかけ「testA,1,200412」といったようにその対象となるレコードを取得したいのです。 今はWinAPIを使って作成すると言ったことから CreateFileなどの関数でCSVを読み込むところまで出来ましたが、要領がわからず調べても要領がわからずに1日無駄にすごしてしまいました、そこで どなたかアドバイスをもらえればと思い質問いたしました。 環境はVC++6.0です、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

落ち着いてアルゴリズムを考えてみよう。 ・CSVファイルから1行読み込む(ReadFile()など) ・行を項目でぶった切る(lstrcmp()、cstrcpy()など) ・1個目の項目がtextAと同じか調べる(lstrcmp()など) ・取り込む。 これだけで分からなくても、もう少し範囲を絞った質問にした方がみんな応えやすいと思うな。例えば、「1行をchar str[2048]に入れる事は出来たけど、項目の切り出しはどうやるの」とか。

AquaSkyMoon
質問者

お礼

1日出てたもので返事が遅くなりましたm(_ _)m 現在自宅で開発環境がないもので実践できませんが、 明日アドバイスをいただいた方法でもう一度トライしてみようと思います。 あと、問題点の整理。どこまで出来てどこが分からないのかということを自己分析してから質問できるよう心がけます。 ありがとうございました。

その他の回答 (1)

  • VirtualT2
  • ベストアンサー率58% (18/31)
回答No.2

憶測ですが、C++と書いているけどCの勉強中(研修?)なのかな? (失礼であったら、申し訳ないです) #1さんの回答でバッチしOKなのですが、 当方が上記のようなカンジでは?と推測し処理フローをかいてみます 問題アリまくりですが…あえて…ね ----------------------------------------------- ファイル名からファイルハンドルを取得する ハンドルからファイルサイズを取得する ファイルサイズ分のメモリを確保する(爆w) 確保したメモリにファイルを読み込む ファイルハンドルを開放する 読み込んだ先のメモリ先頭ポインタのコピーを2つとる。(MとPとす) △Pのコピー、Aを作る。  比較項目までAを進め(','を該当項目まで探す)、Aと検索対象を比較する。  (比較対象が文字列なら、文字数分だけ比較する。値ならAto?関数で値化し比較する)  該当しなかったら、Pを次の行まで進め、△に戻る  (ポインタが確保したメモリサイズ以上進まないようにしてね) 該当したら、Pが、その行の先頭である。 返値の種類に応じて処理をし、 確保したメモリ(M)を開放し、処理の終了とす。 ------------------------------------------- と、こんなカンジ。 但し、下記の問題点がある。 検索該当行が複数あっても常に最初にHitしたもののみしか検索しない。 項目の切り出し処理もしてない。 検索文字列に','及び、改行コードは使えない。 この処理を行うシステムのメモリ使用制限が無いものとしてる。 その他、もろもろ。 ----------------------------------------------- PS.コード書いた方が早いなぁ。説明するより~

AquaSkyMoon
質問者

お礼

なるほどーと、自分が考えていた方法と違うフローを提示いただき参考になりました。 夜もおそくなったので夢の中でじっくりと考察したいと思います(泣 ありがとうございます、一応明日じっくりと作り込みを行いたいと思います。

関連するQ&A

  • 65536行を超えるcsvファイルから検索したい

    実際70万レコードほどはあるcsvファイルを開いたらもちろん65536行で切れました。 このファイルからある列で数字の1が入っているレコードを検索したいんですが、何か方法ありますでしょうか? どなたかご存知の方お教えください。

  • csvファイルを開かずに文字を検索し行を抽出したい

    フォルダの中に複数のCSVファイルが有ります。 これらのファイルを開かずに文字列を検索し、検索対象の文字と完全一致する 文字がある行をまとめてひとつのファイルに抽出する方法を探しています。 例:Aフォルダ内にファイル1、ファイル2、ファイル3、、、と複数のファイルがある。 ファイルのフォーマットはすべてCSV。ファイルにはシートは一つのみ。日付なのですべて異なります。       A         B  C   D   E   F  G   H   I   J  K   L 加工年月日時分 品種 コード A列 B列 C列 D列 E列 F列 G列 本数 作業者    ・    ・    ・ A~Lまであり、Cのコードが指定した検索文字と完全一致するものを抽出したいです。 急ぎの内容の為、VBAやコマンドプロンプトなど、自分なりに色々なサイトにある プログラムを組み換えようとしましたが初心者の為すぐに理解して応用はとても 無理でした。知恵を貸して頂きたいです。

  • windows7ユーザフォルダにアクセス禁止させる

    ユーザフォルダ(C:\Users\testA)にデフォルトの設定では他のユーザが誰でもアクセスできてしまうのを、誰もアクセスできないように設定したいです。 アカウント:testA グループ:管理者(administrator) アカウント:testB グループ:管理者(administrator) アカウント:testC グループ:標準ユーザ 3つのユーザを作って切り替えて使っているのですがデフォルトの設定では ユーザフォルダC:\Users\testA にユーザtestBもtestCもアクセスできてしまいます。(これがwindows7のユーザ管理のデフォルト仕様?) ここでのアクセス状態は、 ユーザtestBはtestAフォルダ以下を参照可能、ファイルの中身も閲覧可能です。 ユーザtestCはtestAフォルダ以下を参照可能、ファイルの中身は閲覧不可です。 windows XPの場合は、アカウントを作成するときに「フォルダとファイルをプライベートにする」みたいな設定にチェックをすれば、 同じadministratorであっても、他のユーザフォルダにアクセスはできなかったはずなんですが、 windows7ではそういうのが無く、標準ユーザあっても管理者ユーザであってもデフォルトの設定では他人のユーザフォルダを見れてしまうようです。 testAにアクセスを禁止するにはtestAのセキュリティ設定からアクセスさせたくないユーザを 外すなどして、デフォルトから設定変更するなど、めんどくさいことをしないといけないのでしょうか?   他に簡単なやり方があるのでしょうか? windows7 Home Premium です。

  • 【windowsバッチ】CSVの編集

    とあるCSVファイル(先頭行はヘッダー項目)において、個人コード(先頭列)に文字列を含むレコードを除外したいです。 (個人コードに文字列を含まないレコードを読み込んで、新たにCSVファイルを作成でも可) 出来ればVBS等は用いず、バッチのみで行いたいのですが… 恐れいりますが、どなたかご教示いただけますでしょうか。 よろしくお願いいたします。

  • CSVファイルによる検索の高速化

    CSVファイル内を検索し、一致した行を抽出して出力する際、みなさんはどのような方法を選びますか?私の手元にあるCSVファイルは3000行以上のファイルで、500KBあります。出来る限り、高速化したいのです。文字コードはUTF-8で日本語が主に書かれています。

    • ベストアンサー
    • PHP
  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • CSVファイルからn個目の項目を取得する方法

    タイトルの通りCSVファイルからn個目の項目を取得する方法を教えていただきたいです。 例 1レコードあたり100項目あるCSVファイルから1個目、10個目、13個目の項目を取得する。 1レコードあたり項目数が少なければ下記コマンドでいけると思うのですが項目が多いと非常に遅くなってしまいます。 (やり方が悪いだけかもしれません) sed -e 's/¥(.*¥),¥(.*¥),•••••/¥1,¥10,¥13/' ファイル名 よろしくお願いします。

  • CSVファイル中の文字列項目の中に混じった

    CSVファイルからRDBへのロードで悩んでいます。 以下の様なCSVファイルがあり (よくあることかもしれませんが)データの中に " が混じっているため、正常にデータをロードできません。 文字列データ中の " を削除するか、代替文字に置換したいのですが、 なにかいい知恵は無いでしょうか? 例: $ cat DATA.csv 10,"0010","教育","キョウイク",2300 20,"0110","美容&健康","ヒ"ヨウ&ケンコウ",2300   ←ビ ではなく ヒ" 30,"1010","趣味","シュミ",2312 40,"0030","マネー","マネー",3300 ただし、 ・CSVを作成するプログラムの関係で、   CSVファイル中の ,区切り "括りルールは変更できない ・ファイルは可変長 ・誤った " は上記以外にも無数に予想されること   レコード件数が多いこと から、   sedなど自動化された方式が望ましい ・OS は Solaris8 ・RDB は Oracle9i ・シェアウェアなどのオンラインソフトの使用は不可 ・文字列データ中の " はすべて誤った文字と見なして良い  (もちろん括り文字 " は生かすこと) 正規表現を用いてsedでなんとかならんか?といろいろ試行錯誤してみたのですが、 イマイチうまくいきません。 どうかよろしくお願いします。

  • VBAでのファイル検索

    ExcelVBAで下記のマクロを組みたいのですが、 やり方がわからなくて困っております。 ・複数のcsvファイル内から条件に一致する内容のファイルを検索して  開きたい。  ※条件というのは、csvファイル内に記入してある、文字列を指します。  ※csvファイル名でのファイル判別は不可  フォルダ内のcsvファイルを全て開いて、一つのファイル毎  If文でチェックしていくしかないでしょうか? どなたかご存知の方、指導お願い致します。

  • C# でCSVファイルから検索したい文字取得ついて

    C# でCSVファイルから検索したい文字取得ついて CSVファイル内容 "1","7500000","ヤマ","シモノ","アイ","山","下市" "2","7500100","ヤマ","シモノ1","アイ1","山1","下市1" "3","7500200","ヤマ","シモノ2","アイ2","山2","下市2" "4","7500300","ヤマ","シモノ3","アイ3","山3","下市3" このCSVデータで7500100と検索したらその行にあるアイ1と取得したいけど、どうしたら出来ますか? 又、CSVファイルから読み出し方法も教えて戴けないでしょうか? お手数ですが、どなたか教えて戴けませんか?

専門家に質問してみよう