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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Basic .NET

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

Visual Studio 2012

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

.NET Framework

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

VB.NET

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

Q&A

解決済

3回答

2565閲覧

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

churi_yuzuki

総合スコア32

Visual Basic .NET

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

Visual Studio 2012

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

.NET Framework

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

VB.NET

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

0グッド

1クリップ

投稿2017/02/24 07:51

###前提・実現したいこと
イメージ説明
上図のようなテキストファイルを読み込み、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

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

ご教授お願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/24 08:07

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

2017/02/26 10:33

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

回答3

0

ベストアンサー

VB.Net

1Dim dr1() As DataRow = datatable.Select("tag = 'B'") 2Dim dr2() As DataRow = datatable.Select("tag = 'D'") 3Dim tmp() As DataRow 4 5For i As Integer = 0 To datatable.Columns.Count - 2 6 tmp(i) = dr1(i + 1) 7 dr1(i + 1) = dr2(i + 1) 8 dr2(i + 1) = tmp(i) 9Next

上記だと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番目という前提ですが
以下のようになると思います。

VB.Net

1Dim dr1 As DataRow() = datatable.Select("tag = 'B'") 2Dim dr2 As DataRow() = datatable.Select("tag = 'D'") 3Dim tmp As Object 4 5For i As Integer = 1 To datatable.Columns.Count - 1 6 tmp = dr1(0).Item(i) 7 dr1(0).Item(i) = dr2(0).Item(i) 8 dr2(0).Item(i) = tmp 9Next

投稿2017/02/26 15:21

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

churi_yuzuki

2017/03/06 00:45

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

0

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

投稿2017/02/25 22:13

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

churi_yuzuki

2017/02/26 10: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のカラム名) どこが問題なのでしょうか、、
dojikko

2017/02/27 02:02

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

2017/02/27 02:15

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

2017/02/27 02: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なのか、値を代入するときにエラーがでるのか等々
churi_yuzuki

2017/03/06 00:49

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

0

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

投稿2017/02/24 08:01

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

churi_yuzuki

2017/02/26 10: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のカラム名) どこが問題なのでしょうか。。
Zuishin

2017/02/26 10:47

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

2017/02/26 14: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)というのは何を指しているのでしょうか。。
Zuishin

2017/02/26 14:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問