• 締切済み

VBで重複しているデータをユニークしたい

開発環境:VB2005 質問者レベル:初心者  CSVファイルを読み取り配列に商品レコードのデータを入れて、 このままでは商品コードが重複しているのでそれをユニークしたいのですが。 例。左の表を右の表のようにしたい。 商品コード 商品名  商品コード 商品名 00001 商品A   00001 商品A 00002 商品B   00002 商品B 00001 商品A   00003 商品C 00003 商品C 00002 商品B 今は配列を2つ用意して、FOR文を使って処理しているのですが。 もとの商品コードがだぶった状態でレコードが10000行ぐらいあるので。 少し処理に時間がかってしまい重く感じます。 配列ではなくデータベースやDataSet(名前を知っているレベルで 使ったことがないですが・・・)などを使えばよいのでしょうか? 何かスマートなやり方や良いアイデア等がありましたら 教えてもらえないでしょうか?

みんなの回答

noname#60992
noname#60992
回答No.4

ADOなどでリンクしてSQL一発の例。(スクリプトだけど) 早いかどうかは、やってみないとわからない。(そんなに変わらないと思う) とりあえず参考までに。 

参考URL:
http://www.microsoft.com/technet/scriptcenter/resources/qanda/aug05/hey0819.mspx
すると、全ての回答が全文表示されます。
noname#221368
noname#221368
回答No.3

#1さんのやり方は、標準的なものだと思います。思いますが、もし全てをSQLで処理するようになるのなら、反対です。.NETの配列は非常に高性能になったので、配列(とCollection)も併用すべきだと思います。以下は#2さんのやり方に、概ね準じています。  キーブレイク処理のために、Dictionary型のCollectionを利用します。 Dictionary(of T,Type)は、.NET組み込みのCollectionの一つで、Sortの手間が省けます。nはCSVのData数で、nに関するLoopは適当に読み替えて下さい。 Dim OnlyOne as New Dictionary(of String,Integer) Dim TargetData(-1) as Elem 'CodeとNameというStringメンバを持つ、ClassまたはStructureとします. Dim TargetCount as Integer = 0 For i as Integer = 0 to n  Dim Code as String = 'CSVファイルからの1レコードの商品コード  If OnlyOne.ContainsKey(Code) = False Then   TargetCount = TargetCount + 1   Redim Preserve TargetData(TargetCount - 1)   TargetData(TargetCount - 1) = New Elem   TargetData(TargetCount - 1).Code = Code   TargetData(TargetCount - 1).Name = 'CSVファイルからの1レコードの商品名   OnlyOne.Items.Add(Code, i)  End If Next i  OnlyOne.ContainsKey(Code)は、DictionaryであるOnlyOneが、Codeに一致するKey(キー)を含むかどうかを判定する関数です。OnlyOne.Items.Add(Code, i)は、OnlyOneがCodeを含まないとIfで判定された場合に、OnlyOneにCodeを登録するMethodです。以上は、CSV読み込み時、一回だけ行えばよい作業です。  TargetDataの配列を得た後では、Array.SortやArray.Find,Array.FindAllを用いて、SQLと同じ事ができます。Data数が多い場合、SQLを用いるより、配列を用いた方が高速と思えます。

すると、全ての回答が全文表示されます。
  • tomo316
  • ベストアンサー率35% (51/142)
回答No.2

>何かスマートなやり方や良いアイデア等がありましたら ANo.1さんのようすればスマートですが。 >少し処理に時間がかってしまい重く感じます。 処理時間は、変わらないでしょう。 文章から、配列を使って処理しているので遅いと思います。 こう言う場合は、基本に戻れば解決する場合があります。 (昔は、マシンパワーが小さく、データ量が多い場合みんなこうしてました。) 1、商品コードでソートし、ソート済みファイルを作る(昇順)。 2、ソート済みファイルを商品コードでキーブレイク処理を行いだぶった状態の無いファイルを作る。 3、だぶった状態の無いファイルを処理対象とする。 キーブレイク処理は先輩に聞いてください、知ってるはずですから。 学校でも多分習ったと思います。

すると、全ての回答が全文表示されます。
  • pbforce
  • ベストアンサー率22% (379/1719)
回答No.1

CSVをデータベースとして扱って、SQLで抽出すれば簡単に出来ます。

すると、全ての回答が全文表示されます。

関連するQ&A