質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • VB.NET

    918questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • .NET Framework

    456questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

  • Visual Basic .NET

    97questions

    Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

  • Visual Studio 2012

    91questions

    Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

.NETで、配列の要素を並び替えしたい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 605

churi_yuzuki

score 24

前提・実現したいこと

イメージ説明
上図のようなテキストファイルを読み込み、DataTableに格納するプログラムを書いています。

しかし、ある条件下では、
BとDの値を入れ替えたいと思っています。

例)
B 430 420 700
D 220 200 600

発生している問題・エラーメッセージ

1行ずつ読み込んでいる関係で、どう実現すればいいか悩んでいます。

該当のソースコード

       Dim datatable As DataTable = New datatable

            Dim datarow As DataRow

            Dim parser1 As TextFieldParser = New TextFieldParser(filepath, Encoding.GetEncoding("Shift_JIS"))

            parser1.TextFieldType = FieldType.Delimited
            parser1.SetDelimiters(vbTab) '区切り文字はタブ

            '読み込み行がなくなるまで
            While (Not parser1.EndOfData)
                ' 1行読み込み
                Dim row1 As String() = parser1.ReadFields()
                datarow = datatable.NewRow()

                ' datatableのrowのcolumn数だけループ
                 For i As Integer = 0 To row1.Count - 1
                      datarow(i) = row1(i)

                 Next i
                       datatable.Rows.Add(datarow)

            End While

その他

このコードの流れで実現することは可能でしょうか。

ご教授お願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/02/24 17:07

    テキストファイルなのだからメモ帳で開いて編集してからプログラムを起動して DataTable を作ればいいんじゃないかと思ってしまいますが、そういう話ではないのですよね?

    キャンセル

  • churi_yuzuki

    2017/02/26 19:33

    入力するテキストファイルはいじれないのでプログラム側で対応する形となってます。。

    キャンセル

回答 3

checkベストアンサー

+1

Dim dr1() As DataRow = datatable.Select("tag = 'B'")
Dim dr2() As DataRow = datatable.Select("tag = 'D'")
Dim tmp() As DataRow

For i As Integer = 0 To datatable.Columns.Count - 2
    tmp(i) = dr1(i + 1)
    dr1(i + 1) = dr2(i + 1)
    dr2(i + 1) = tmp(i)
Next


上記だとtmpが空のDataRow配列を宣言しているだけなのでtmp(i)はエラーとなります。
また、dr1dr2ともにDataRowの配列です。
今回の場合、多分"tag = 'B'"の行も"tag = 'D'"の行も1行しかないという
前提なのでしょうから、dr1dr2も要素数が1の配列になっていると思います。

For文はColumn(1)~最後までの値を入れ替えるつもりなのでしょうが、dr1dr2は配列なのでdr1(i)と書いてもDataRow型となります。
カラムのデータを取得するにはdr1(0).Item(i)と書かないといけません。

また、カラムのデータを入れ替えるためのワークとしてtmpを用意しているのですから、
DataRow型ではなくObject型として用意すべきです。

'B'のデータ、'D'のデータが1行づつしかない&tagカラムが0番目という前提ですが
以下のようになると思います。

Dim dr1 As DataRow() = datatable.Select("tag = 'B'")
Dim dr2 As DataRow() = datatable.Select("tag = 'D'")
Dim tmp As Object

For i As Integer = 1 To datatable.Columns.Count - 1
    tmp = dr1(0).Item(i)
    dr1(0).Item(i) = dr2(0).Item(i)
    dr2(0).Item(i) = tmp
Next

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/06 09:45

    遅くなりました。
    ご回答ありがとうございます。
    上記のコードで実行できました、ありがとうございました!
    型の関係が良く分かってませんでした。。

    キャンセル

+1

DataTableに取り込むときではなく、取り込んだ後でDataTable上で書き換えたいように書き換えるコードを書けばよい話では?
難しく考えすぎているような気がします
それとも提示されている仕様以外にコンテクスト依存の仕様があるのでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/26 19:38

    回答ありがとうございます。
    下と同様に、その方向で検討して、
    Dim dr1() As DataRow = datatable.Select("tag = 'B'")
    Dim dr2() As DataRow = datatable.Select("tag = 'D'")
    Dim tmp() As DataRow

    For i As Integer = 0 To datatable.Columns.Count - 2
    tmp(i) = dr1(i + 1)
    dr1(i + 1) = dr2(i + 1)
    dr2(i + 1) = tmp(i)
    Next

    としましたが上手くいきませんでした。(tagはA~Iのカラム名)
    どこが問題なのでしょうか、、

    キャンセル

  • 2017/02/27 11:02

    そもそもなんですがBとDは1件ずつ出現するのでしょうか?
    それとも複数出現する可能性があるのでしょうか?

    キャンセル

  • 2017/02/27 11:15

    1件ずつです。
    tagカラムは全て一意な値です。

    キャンセル

  • 2017/02/27 11:55

    値を入れ替えるだけなら
    Dim BfoundRow = datatable.Select("tag = 'B'")
    Dim DfoundRow = datatable.Select("tag = 'D'")

    Dim Tag = BfoundRow(0).Item("tag") '別に要りませんが
    Dim Value1 = BfoundRow(0).Item("value1")
    Dim Value2 = BfoundRow(0).Item("value2")
    Dim Value3 = BfoundRow(0).Item("value3")
    とでもしておいて
    BfoundRow(0).Item("value1") = DfoundRow(0).Item("value1")
    BfoundRow(0).Item("value2") = DfoundRow(0).Item("value2")
    BfoundRow(0).Item("value3") = DfoundRow(0).Item("value3")

    DfoundRow(0).Item("value1") = Value1
    DfoundRow(0).Item("value2") = Value2
    DfoundRow(0).Item("value3") = Value2
    を実行できないですか?
    エラーとか諸々一切考慮していませんので、適宜処理してください

    そもそもどこでエラーが出ているのかステップ実行で確認する癖をつけましょう
    BfoundRow や DfoundRow がNothingなのか、値を代入するときにエラーがでるのか等々

    キャンセル

  • 2017/03/06 09:49

    返事遅れました。
    ご回答ありがとうございます。
    上記の方法でも出来ました!
    デバッグの見方を練習します、ありがとうございました。

    キャンセル

0

DataTable に全部入れた後に B の含まれている行と D の含まれている行の B と D を入れ替えたらいいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/26 19:37

    回答ありがとうございます。
    その方向で検討して、
    Dim dr1() As DataRow = datatable.Select("tag = 'B'")
    Dim dr2() As DataRow = datatable.Select("tag = 'D'")
    Dim tmp() As DataRow

    For i As Integer = 0 To datatable.Columns.Count - 2
    tmp(i) = dr1(i + 1)
    dr1(i + 1) = dr2(i + 1)
    dr2(i + 1) = tmp(i)
    Next

    としましたが上手くいきませんでした。(tagはA~Iのカラム名)
    どこが問題なのでしょうか。。

    キャンセル

  • 2017/02/26 19:47

    なぜ違うフィールドに入れるのですか?
    tmp(tag) = dr1(tag)
    dr1(tag) = dr2(tag)
    dr2(tag) = tmp(tag)

    キャンセル

  • 2017/02/26 23:00

    For tag As Integer = 0 To datatable.Columns.Count - 2
    tmp(tag) = dr1(tag)
    dr1(tag) = dr2(tag)
    dr2(tag) = tmp(tag)
    Next

    一応試したのですがエラーが起きました。。
    tmp(tag)というのは何を指しているのでしょうか。。

    キャンセル

  • 2017/02/26 23:08

    こちらが聞きたいです。カラム名ではないのですか?
    DataRow(カラム名)でデータが取れるはずですが。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    SQLパラメーター式テーブルの値をand検索する

    実現したいこと fruit_id : 1 -> apple fruit_id : 2 -> mikan fruit_id : 3 -> banana テーブル名 : f

  • 解決済

    VBA 配列

    お世話になっております。 配列について学習を進めておりますが、イマイチどのようにデーターが格納されているくな分からず、意図した処理ができない状態です。 D列に"No"が合っ

  • 解決済

    IntelliJ IDEA でKotlinの実行ができない

    実現したいこと IntelliJ IDEAで Kotlinのプログラムを実行したいです。 しかしエラーが表示されてしまいます。 ソースコード package sampl

  • 解決済

    本日と比較して7日以内であることを判定

    $modified = 2017-07-01 13:43:31 $modified_time = strtotime($modified); echo date('Y/n/j',

  • 解決済

    Unityでのスクリプトの作成について

    Uniytを始めとしてプログラムソフトについては、全くの初心者で勉強を始めたばかりです。 いろいろとネットを検索して、第1段階としてコンソールに、「Hello, World.」

  • 解決済

    python-shogiの使い方

    python3(anaconda)にpython-shogiモジュールを入れて shogi.CSAを使いたいのですがエラーがでて使えません。どのようにすればよいのでしょうか sho

  • 解決済

    ExcelのVBAで金種計算表をDo While文とIf文のみで作成したい

    ExcelのVBAで金種計算表をDo While文とIf文のみで作成したいのですが、下記のプログラムを実行してもExcel自体が応答不能になってしまいます。 下記に金額を入力すると

  • 解決済

    JavaでPDFファイルをxml変換する

    前提・実現したいこと JavaでPDFファイルをXMLに変換したいです。 単純にXMLに変換し、出力したいのですが、使用するライブラリやコーディングがわかりません。 該当のソー

同じタグがついた質問を見る

  • VB.NET

    918questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • .NET Framework

    456questions

    .NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

  • Visual Basic .NET

    97questions

    Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

  • Visual Studio 2012

    91questions

    Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです