csvを新ファイルに8番目で大きい順に並び替え

このQ&Aのポイント
  • VB2010です。Itm(7)を基準に数字の大きい順に並び替えたい。CSVは全部で19列あり、行数はだいたい100行ぐらいです。
  • Do Untilループを使用して、ファイル内の各行を読み取ります。最初の行は、新しいファイルに書き込まれます。2番目以降の行は、新しいファイルの適切な位置に書き込まれます。
  • Itm(7)の値が現在の行のItm(7)の値よりも大きい場合、その行を新しいファイルに書き込みます。それ以外の場合、現在の行の位置に書き込みます。最後に、元のファイルを削除し、新しいファイルの名前を変更します。
回答を見る
  • ベストアンサー

csvを新ファイルに8番目で大きい順に並び替え

VB2010です。 前回、質問させて頂いた続きです。 前回は質問の仕方が失敗で大変皆様にご迷惑をおかけしました・・・・・ 本当に申し訳なく思っています・・・ もうだんだん迷路に入ってしまったので、コードをそのまま記載しました。 Itm(7)を基準に数字の大きい順に並び替えしたいのです。 CSVは全部で19列あります。 ファイルによって違いますが、行数はだいたい100行ぐらいです 無理やりしたのコードを書いたのですが、あと一歩でやはりきれいに並び替えができません・・・ 大変皆様にお手数ですがお助け下さい・・・・ プロの皆様にはかなり幼稚なコードで大変失礼します。 いろいろと試してみたのですが、これぐらいしか自分の力量では思いつかなくて・・・・ 沢山失敗を繰り返したので変なコードも入っているかもですが・・・・・ Dim z As Integer = 0 Dim ReaderA As New IO.StreamReader(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & ".csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim LineA As String = ReaderA.ReadLine Dim Itm() As String Dim s As Integer = 0 Do Until IsNothing(LineA) Itm = LineA.Split(",") If z = 0 Then Dim Writer As New IO.StreamWriter(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv", False, System.Text.Encoding.GetEncoding("Shift-JIS")) Writer.WriteLine(LineA) Writer.Close() Else Dim ReaderB As New IO.StreamReader(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Writer As New IO.StreamWriter(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New2.csv", False, System.Text.Encoding.GetEncoding("Shift-JIS")) Dim LineB As String = ReaderB.ReadLine Dim Stm() As String Dim u As Integer = 0 Do Until IsNothing(LineB) Stm = LineB.Split(",") If Integer.Parse(Itm(7)) > Integer.Parse(Stm(7)) Then If u = 0 Then Writer.WriteLine(LineA) u += 1 End If End If Writer.WriteLine(LineB) If Integer.Parse(Itm(7)) <= Integer.Parse(Stm(7)) Then If u = 0 Then Writer.WriteLine(LineA) u += 1 End If End If s += 1 LineB = ReaderB.ReadLine Loop Writer.Close() ReaderB.Close() IO.File.Delete(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv") Microsoft.VisualBasic.FileSystem.Rename(SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New2.csv", SyFolder & Me.Combo0.Text & "\Data\Sales\EachMonth\" & Me.ComboBox1.Text & "New.csv") End If z += 1 LineA = ReaderA.ReadLine Loop ReaderA.Close()

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

  • ベストアンサー
回答No.6

またまた、やっちゃったみたいです。質問は「大きい順に並び替え」ですよね。 先ほどの物は「小さい順」でした。 下記のコードですと「小さい順」になります。 For l1 = 1 To dtcnt For l2 = 0 To dtcnt - 1 - l1 Dim txt1 As String = data(l2) Dim txt2 As String = data(l2 + 1) Dim txtint1 As Integer = txt1.IndexOf(",") 'カンマの位置を取得 Dim txtint2 As Integer = txt2.IndexOf(",") 'カンマの位置を取得 If CInt(data(l2).Substring(0, txtint1)) < CInt(data(l2 + 1).Substring(0, txtint2)) Then uptmp = data(l2) '入れ替え前の上の値 downtmp = data(l2 + 1) '入れ替え前の下の値 data(l2) = downtmp '入れ替え後の上の値 data(l2 + 1) = uptmp '入れ替え後の下の値 End If Next 「大きい順に並び替え」は下記のようになります。 For l1 = 0 To dtcnt - 1 For l2 = l1 + 1 To dtcnt - 1 Dim txt1 As String = data(l1) Dim txt2 As String = data(l2) Dim txtint1 As Integer = txt1.IndexOf(",") 'カンマの位置を取得 Dim txtint2 As Integer = txt2.IndexOf(",") 'カンマの位置を取得 If CInt(data(l1).Substring(0, txtint1)) < CInt(data(l2).Substring(0, txtint2)) Then uptmp = data(l2) '入れ替え前の上の値 downtmp = data(l1) '入れ替え前の下の値 data(l2) = downtmp '入れ替え後の上の値 data(l1) = uptmp '入れ替え後の下の値 End If Next 何回もすみません。(汗 もう謝り様がありません、返すことばもありません。 ごめんなさ~い。 それと、並び替えの画像が下記URLでわかりやすく書かれています。 [いろいろなソートアルゴリズム] http://www.ibe.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/ あと、Sortで並べ替えは非合法だと思っていましたが、kmeeさんの回答によると、私が前回提案させていただいた、 リスト.Sort() '並べ替え リスト.Reverse() '降順  もありのようですね。 Sortの '並べ替えは、数字の大小ではなく、辞書の順番で並べ替えるため少々危険と思い「非合法」といいましたが、「合法」であればSortの '並べ替のほうがず~っと簡単です。

KenKen1978
質問者

お礼

でも、やっ~~~~~とクリア出来たので今日はここで並び替えは一休みかなぁ・・・ 明日からsortに関してはご提案のURLからしっかりx100勉強します!!! 本当にご丁寧にお付き合い下さってありがとうございます^^ 最後に初心者なので savefile2(data(l2)) Private Sub savefile2(ByVal linetest As String) ↑の方法があるのも初めてしりました・・・・・(恥ずかしながら・・・) 凄く便利ですね^^ 一つの質問で沢山の勉強をさせて頂きました!!! この感謝を言葉では言い表せない程ですが、 本当にありがとうございましたm(__)m

KenKen1978
質問者

補足

いえいえ!!! 小さい順は自分でなんと判明出来ましたので、勉強になりました~~~~ たしかに今後の事を考えるとsortもしっかり勉強するべきだと思います

その他の回答 (5)

回答No.5

大変、大変申し訳あいりません。もう一箇所ありました。 気にはなっていたのですが、VBが自動変換してくれると思い、そのままにいしていましたが、自動変換はしてくれないようです。 誤 If data(l2).Substring(0, txtint1) < data(l2 + 1).Substring(0, txtint2) Then 正 If CInt(data(l2).Substring(0, txtint1)) < CInt(data(l2 + 1).Substring(0, txtint2)) Then Integer型に変換してください。 重ね重ねお詫び申し上げます。 おかしいな~   自動変換してくれないのかな~

KenKen1978
質問者

お礼

あああああ 僕の勘違いです!!! スイマセン きちんとsavefile2で並び替えられています!!! あとファイルのreaderBのcloseを入力すれば良いのですね^^ 早とちりしてしまいますた・・・・m(__)m

KenKen1978
質問者

補足

えっ~~と 全部やってみました! 始めのsavefile1の時点で数字の小さい順に並びえかられているファイルが出力されていますね^^ 次の構文にはいるとなぜか順序がまたバラバラになっているのです・・・・ そしてCSVファイルを開こうとするとまだVBが開いていると通知メッセージが出てきます・・・・ どうしてだろう・・・・ もう少しみたいなので自分でも足掻いてみます!

回答No.4

大変申し訳ありません。 訂正です。 少し実験したところ、エラーがありました。 コードの最初の部分で ↓、 Dim data As New List(Of String) 'リスト dataをStringに指定してあるのに、下記のコードをIntegerに指定してしまいました。 誤 Dim uptmp As Integer '小さい値 Dim downtmp As Integer '入れ替え前の下の要素 正 Dim uptmp As String '小さい値 Dim downtmp As String '入れ替え前の下の要素 すいません。直してください。 こんな単純なミスをするようでは、回答できませんね。

KenKen1978
質問者

お礼

いえいえ そんなご回答本当に感謝しています~~~ 僕もよく小数点まで必要な宣言でIntegerを使っていて、どうしてなんだろう・・・って悩んで自分の注意深さがない事に思い知らされます^^; が、bybalsendercaseさんはレベルの高い部分でのミスだと思いますので羨ましいです!!!

回答No.3

文字制限がありましたので、途中までしか記入できませんでしたので、続きです。 KenKen1978さんのコードは良くできていましたので、それをそのまま使いたかったのですが、私のレベルでは少々無理のようでしたので、こんな風になってしまいました、すいません。できれば、KenKen1978さんのコードでどこがどのようにおかしいのか、具体的な情報を頂ければ、他の方がKenKen1978さんのコードを直してもらえると思います。 前回の回答の中で、CSVファイルの順番を入れ替えてしまいましたが、下記のコードの部分を変更すれば、入れ替えをする必要はありません。 Dim txtint1 As Integer = txt1.IndexOf(",") 'カンマの位置を取得 Dim txtint2 As Integer = txt2.IndexOf(",") 'カンマの位置を取得 降順する場所のカンマの位置を取得すれば、CSVファイルの順番を入れ替えなくても、そのまま降順できます。 CSVファイルの順番を入れ替を入れ替えた場所のコードは↓ savefile1(s8, s1, s2, s3, s4, s5, s6, s7, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19)       ↑ ここで入れ替えてます。 先ほどの回答の続きに下記のコードを追加してください。 Private Sub savefile1(s1 As String, s2 As String, s3 As String, s4 As String, s5 As String, s6 As String, s7 As String, s8 As String, s9 As String, s10 As String, s11 As String, s12 As String, s13 As String, s14 As String, s15 As String, s16 As String, s17 As String, s18 As String, s19 As String) Dim writer As New IO.StreamWriter("ここに、任意のパスを入れる", True) writer.WriteLine(s1 & "," & s2 & "," & s3 & "," & s4 & "," & s5 & "," & s6 & "," & s7 & "," & s8 & "," & s9 & "," & s10 & "," & s11 & "," & s12 & "," & s13 & "," & s14 & "," & s15 & "," & s16 & "," & s17 & "," & s18 & "," & s19) writer.Close() 'ファイル保存のメソッド End Sub Private Sub savefile2(ByVal linetest As String) Dim writer As New IO.StreamWriter("ここに、任意のパスを入れる", True) writer.WriteLine(linetest) writer.Close() 'ファイル保存のメソッド End Sub 不明点は、再度質問してね。 他の方が良い回答をしてくれると思います。 あともうひといきです、頑張ってください。

KenKen1978
質問者

お礼

ここまでの長文でご説明頂けるとは本当に光栄です! 迷路から脱出できそうです~~~~~♪

回答No.2

こんにちは、だいぶ頑張ったようですね。(拍手    サンプルを作成しましたので、参考に  文字制限がありますので、詳細は、説明できません。 KenKen1978さんのコードをそのまま利用したかったのですが、少し難解なてんがありまして、できません Dim data As New List(Of String) 'リスト Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click IO.File.Delete(Application.StartupPath & "\test2.txt") IO.File.Delete(Application.StartupPath & "\test3.txt") Dim readerA As New IO.StreamReader(Application.StartupPath & "\test1.txt", System.Text.Encoding.GetEncoding("shift-jis")) Dim line1 As String 'CSVファイルの一行 Dim itm1() As String '配列の各項目 Dim s1 As String, s2 As String, s3 As String, s4 As String, s5 As String, s6 As String, s7 As String, s8 As String, s9 As String, s10 As String, s11 As String, s12 As String, s13 As String, s14 As String, s15 As String, s16 As String, s17 As String, s18 As String, s19 As String line1 = readerA.ReadLine Do Until IsNothing(line1) itm1 = line1.Split(",") s1 = itm1(0) '書く場所がないので、ここに記入します s2 = itm1(1) 'なるべくKenKen1978 さんのコードに s3 = itm1(2) '近づけたつもりですが、こんな風に s4 = itm1(3) 'してしまいました。 s5 = itm1(4) s6 = itm1(5) s7 = itm1(6) s8 = itm1(7) s9 = itm1(8) s10 = itm1(9) s11 = itm1(10) s12 = itm1(11) s13 = itm1(12) s14 = itm1(13) s15 = itm1(14) s16 = itm1(15) s17 = itm1(16) s18 = itm1(17) s19 = itm1(18) savefile1(s8, s1, s2, s3, s4, s5, s6, s7, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19) line1 = readerA.ReadLine Loop '項目数が多いためテストはしてません readerA.Close() Dim readerB As New IO.StreamReader(Application.StartupPath & "\test2.txt") Dim line2 As String 'CSVファイルの一行 Dim itm2() As String '配列の各項目 Dim dtcnt As Integer 'リストの数 Dim st1 As String, st2 As String, st3 As String, st4 As String, st5 As String, st6 As String, st7 As String, st8 As String, st9 As String, st10 As String, st11 As String, st12 As String, st13 As String, st14 As String, st15 As String, st16 As String, st17 As String, st18 As String, st19 As String line2 = readerB.ReadLine Do Until IsNothing(line2) data.Add(line2) 'CSVファイルの一行をリストにAddする itm2 = line2.Split(",") st1 = itm2(0) st2 = itm2(1) st3 = itm2(2) st4 = itm2(3) st5 = itm2(4) st6 = itm2(5) st7 = itm2(6) st8 = itm2(7) st9 = itm2(8) st10 = itm2(9) st11 = itm2(10) st12 = itm2(11) st13 = itm2(12) st14 = itm2(13) st15 = itm2(14) st16 = itm2(15) st17 = itm2(16) st18 = itm2(17) st19 = itm2(18) line2 = readerB.ReadLine Loop dtcnt = data.Count Dim uptmp As Integer '小さい値 Dim downtmp As Integer '入れ替え前の下の要素 Dim l1 As Integer 'ループカウンター Dim l2 As Integer 'ループカウンター For l1 = 1 To dtcnt For l2 = 0 To dtcnt - 1 - l1 Dim txt1 As String = data(l2) Dim txt2 As String = data(l2 + 1) Dim txtint1 As Integer = txt1.IndexOf(",") Dim txtint2 As Integer = txt2.IndexOf(",") If data(l2).Substring(0, txtint1) < data(l2 + 1).Substring(0, txtint2) Then uptmp = data(l2) '入れ替え前の上の値 downtmp = data(l2 + 1) '入れ替え前の下の値 data(l2) = downtmp '入れ替え後の上の値 data(l2 + 1) = uptmp '入れ替え後の下の値 End If Next savefile2(data(l2)) 'ファイルの保存  順番が違います。 Next '不明な点は、返信おねがいします。 End Sub ここまでしか、記入できませんでしたので、続きは別回答します。

KenKen1978
質問者

お礼

本当にいつもご丁寧にありがとうございますm(__)m

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

すみません。コード読んでどんなアルゴリズムでやろうとしているのかわかりません。 100行くらいなら、全部読み込んでもメモリが足りないなんてことはないでしょうから、 (1)ファイルから全部読み込んで、配列に入れる (2) (1)の配列をソート : 8列目で比較する (3) (2)で並び換えたものをファイルに出力 配列は List(of String)を使えば、ReadLine→Addで追加していけます。 勉強のためなら、自分でソートプログラムを組んでみましょう。 並び換える方法はいろいろあります。 http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88 100個程度なら、バブルソートでも十分でしょう。 <や>で比較しているところを、「8列目で比較」にします。 楽をするなら、ListのSortメソッドを使います。 比較方法を変えるには、MSDNのサンプルを参考にするとよいでしょう http://msdn.microsoft.com/ja-jp/library/w56d4y5z%28v=vs.90%29

KenKen1978
質問者

お礼

kmeeさんのおっしゃるとおり自分でもどこに行っているのかわからなくなっていたのです。 ソート やバブルソート・・・・・・・ listboxのsortをつかってなど・・・ なんども調べて試してきました・・・・ しかし必ずどこかで行き詰ってしまっていたのです。 完全に迷路ですよね・・・・ でも仰っている方法が僕がしたい事なのです・・・・

関連するQ&A

  • CSVファイルの出力に関して

    環境:Windows7 / VIsual Basic 2008 教えて下さい。 データベースの値を、CSVファイルとして出力する為に、以下のような記述を しましたが、どうしても下記のようなエラーとなってしまいます。 Cドライブの直下は記述すべきでなく、アクセス権がないのが原因かと思われますが、 なんとかCドライブの直下へ出力したいと考えています。 良い方法はないでしょうか? 《記述内容》  '保存先のCSVファイルのパス  Dim csvPath As String = "C:\ABC.csv"  'CSVファイルに書き込むときに使うEncoding  Dim enc As System.Text.Encoding = _  System.Text.Encoding.GetEncoding("Shift_JIS")  Try '開く Dim sr As New System.IO.StreamWriter(csvPath, False, enc)  Dim colCount As Integer = dtTable.Columns.Count   Dim lastColIndex As Integer = colCount - 1  以下省略・・・ 《エラー内容》  パス 'C:\ABC.csv' へのアクセスが拒否されました。 仮にアクセス権を付加するしか方法がないようであれば、申し訳ありませんが、 その方法も教えて頂ければと思います。 教えて下さい。 よろしくお願いします。

  • CSVファイルをMDBに取り込む

    お世話になります。 現在、在庫管理の簡易システムを作成しています。 環境は、下記の通りです。 言語:VB2005 DB:Access2003 AccessのテーブルにCSVの在庫データの取り込みを作成中ですが、下記のエラーが発生します。 「ファイル 'C:\Temp\HAS4PJ\HZaiko20090319160646.mdb' が見つかりませんでした。」 デバッグをすると、CSVのファイル名は確かに「ファイル名.csv」なのですが、 エラーで表示されるファイル名は、「ファイル名.mdb」と表示されます。 因みにソースは下記の通りです。 ------------------------------------ Dim csvNm As String Dim fbd As New FolderBrowserDialog Dim ofd As New OpenFileDialog With ofd .Title = "本社在庫取込" .FileName = "HZaiko*.csv" .FilterIndex = 1 .Filter = "CSVファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*" .Multiselect = False .InitialDirectory = Application.StartupPath & "\CSV\" If .ShowDialog = Windows.Forms.DialogResult.OK Then csvNm = .FileName Dim tfp As New FileIO.TextFieldParser(csvNm, System.Text.Encoding.GetEncoding(932)) MsgBox(csvNm) tfp.Delimiters = New String() {","} Dim Cnn As New OleDb.OleDbConnection(My.Settings.HAS4DBConnectionString) Dim Cmd As OleDb.OleDbCommand = Cnn.CreateCommand() Cnn.Open() Dim sSQL As String = "SELECT * FROM " & csvNm Dim dt As New DataTable Dim Da As New OleDb.OleDbDataAdapter(sSQL, Cnn) Da.Fill(dt) <--ここでエラー発生! 'objDa.SelectCommand = objCmd Da.Update(Me.HaS4DBDataSet1.t_wrkZaiko) End If End With ---------------------------------- 以上、情報をお持ちの方がいらっしゃいましたらよろしくお願いいたします。

  • CSVの読み込みについて

    いつもお世話になります。 TextBox1に品物のコードを入れて、Label1に価格を表示するという簡単そうなものです。 品物のコードはCSVファイルのItem(1)から取得します。ところが存在しないコードを入力すると、 追加情報 : インデックスが配列の境界外です というエラーが出ます。下記ソースに何を追加すればよろしいのでしょうか?ご教授下さい。よろしくお願い致します。 Dim Reader As New IO.StreamReader("C:\XXX.csv", System.Text.Encoding.GetEncoding("Shift-JIS")) Dim Items() As String Dim Line As String = Reader.ReadLine       Dim Code As String 'コード Dim kakaku As String '価格 Do Until IsNothing(Line) Items = Line.Split(",") Code = Items(1) If HinCode = TextBox1.Text Then kakaku = Items(2) Label1.Text = kakaku Exit Sub End If Line = Reader.ReadLine Loop Reader.Close()

  • VB 配列の内容をファイルに書き込む

    VB2008を使用しています。 stg_bitという配列に一文字ずつ「abc・・・」 のように入っているものを、テキストファイルに出力したいのですが・・・ stg_bitという配列の内容をファイルに書き込みたいのですが、 うまくいきません。 ご教授お願いします!! Dim i As Integer Dim stg_str As String Dim Writer As New IO.StreamWriter("C:sample.txt") Writer.WriteLine(stg_bit) Writer.Close()

  • userFormに貼り付けたLabelを変数に

    userFormに貼り付けたLabelが50個貼り付けてあり、Labelの後の数値を変数にしたいのですが、どう指定すればよいでしょうか (label1~label50) 以前シートに貼り付けたComboBoxは下記のようにOLEObjects で指定できることを教えていただきましたがuserFormではOLEObjectではだめなようです --------------------シートの場合は以前これで教えていただいたのですが  Dim i As Integer   For i = 1 To 10     Dim combo As ComboBox     Set combo = Worksheets(1).OLEObjects("ComboBox" & i).Object     Call MsgBox(combo.Value)   Next

  • VB ファイル保存

    XMLファイルに設定情報を保存仕様としているのですが,ある所でエラーが出てうまく走りません. 下記がそのプログラムになりますが,XMLファイルに保存のコメント下の所でエラーになります. エラーの内容は「保護レベルの設定が原因で'windowsApplication1.Form2'にアクセスできません」 です. どなたかご教示のほどよろしくお願いいたします. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'ファイルが存在しない場合に新規にブランクファイルを作成する 'XMLファイルパス Dim xmlFile1 As String = "C:\OBS_Setting.xml" Dim hStream As System.IO.FileStream 'XMLファイルが存在するか確認 If Dir(xmlFile1) = "" Then ' 指定したパスのファイルを作成する hStream = System.IO.File.Create(xmlFile1) ' hStream が破棄されることを保証するために Try ~ Finally を使用する Try ' hStream が閉じられることを保証するために Try ~ Finally を使用する Try Finally ' 作成時に返される FileStream を利用して閉じる If Not hStream Is Nothing Then hStream.Close() End If End Try Finally ' hStream を破棄する If Not hStream Is Nothing Then Dim cDisposable As System.IDisposable = hStream cDisposable.Dispose() End If End Try End If 'XMLファイルに設定データを保存する Dim Area As String = ComboBox1.Text Dim State As String = ComboBox2.Text Dim City As String = ComboBox3.Text Dim BefY As String = ComboBox4.SelectedIndex Dim AftY As String = ComboBox5.SelectedIndex Dim BefM As String = ComboBox6.SelectedIndex Dim AftM As String = ComboBox7.SelectedIndex '保存するオブジェクトの配列を作成 '保存するオブジェクトの配列を作成 Dim myClasses(6) As SampleClass myClasses(0) = New SampleClass() myClasses(0).Number = 0 myClasses(0).Message = Area myClasses(1) = New SampleClass() myClasses(1).Number = 1 myClasses(1).Message = State myClasses(2) = New SampleClass() myClasses(2).Number = 2 myClasses(2).Message = City myClasses(3) = New SampleClass() myClasses(3).Number = 3 myClasses(3).Message = BefY myClasses(4) = New SampleClass() myClasses(4).Number = 4 myClasses(4).Message = AftY myClasses(5) = New SampleClass() myClasses(5).Number = 5 myClasses(5).Message = BefM myClasses(6) = New SampleClass() myClasses(6).Number = 6 myClasses(6).Message = AftM 'XMLファイルに保存 Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(SampleClass())) Dim fs1 As New IO.FileStream(xmlFile1, IO.FileMode.Create) serializer.Serialize(fs1, myClasses) fs1.Close() End Sub 'XMLファイルに保存するオブジェクトのためのクラス Public Class SampleClass Public Number As Integer Public Message As String End Class

  • CSV出力に関して

    開発環境:Visual Basic 2008 教えて下さい。 あるホームページを参考に、CSV出力のプログラム(下記)を作成していますが、その際に、 どうやらデータは出力されているももの、ファイルを開いてもデータの中身が見れません。 メモ帳で開くとデータは存在しています。 何か記述漏れ等ありますでしょうか? 初歩的なトラブルで申し訳ありませんが、教えて下さい。 よろしくお願いします。 《記述内容》 Dim dt As DataTable = CType(G_DATA.DataSource, DataTable) '保存先のCSVファイルのパス Dim csvPath As String = "C:\test1.csv" 'CSVファイルに書き込むときに使うEncoding Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding("Shift_JIS") '開く Dim sr As New System.IO.StreamWriter(csvPath, False, enc) Dim colCount As Integer = dt.Columns.Count Dim lastColIndex As Integer = colCount - 1 'ヘッダを書き込む Dim i As Integer For i = 0 To colCount - 1 'ヘッダの取得 Dim field As String = dt.Columns(i).Caption '"で囲む必要があるか調べる If field.IndexOf(ControlChars.Quote) > -1 OrElse _ field.IndexOf(","c) > -1 OrElse _ field.IndexOf(ControlChars.Cr) > -1 OrElse _ field.IndexOf(ControlChars.Lf) > -1 OrElse _ field.StartsWith(" ") OrElse _ field.StartsWith(ControlChars.Tab) OrElse _ field.EndsWith(" ") OrElse _ field.EndsWith(ControlChars.Tab) Then If field.IndexOf(ControlChars.Quote) > -1 Then '"を""とする field = field.Replace("""", """""") End If field = """" + field + """" End If 'フィールドを書き込む sr.Write(field) 'カンマを書き込む If lastColIndex > i Then sr.Write(","c) End If Next i '改行する sr.Write(ControlChars.Cr + ControlChars.Lf) 'レコードを書き込む Dim row As DataRow For Each row In dt.Rows For i = 0 To colCount - 1 'フィールドの取得 Dim field As String = row(i).ToString() '"で囲む必要があるか調べる If field.IndexOf(ControlChars.Quote) > -1 OrElse _ field.IndexOf(","c) > -1 OrElse _ field.IndexOf(ControlChars.Cr) > -1 OrElse _ field.IndexOf(ControlChars.Lf) > -1 OrElse _ field.StartsWith(" ") OrElse _ field.StartsWith(ControlChars.Tab) OrElse _ field.EndsWith(" ") OrElse _ field.EndsWith(ControlChars.Tab) Then If field.IndexOf(ControlChars.Quote) > -1 Then '"を""とする field = field.Replace("""", """""") End If field = """" + field + """" End If 'フィールドを書き込む sr.Write(field) 'カンマを書き込む If lastColIndex > i Then sr.Write(","c) End If Next i '改行する sr.Write(ControlChars.Cr + ControlChars.Lf) Next row '閉じる sr.Close()

  • Excel VBAのコンボボックス

    お世話になります。 コンボボックス1と2と3は選択されますが コンボボックス4には何の表示もされません。 選択して条件設定は4つ以上できないのでしょうか? Dim ITE As Variant Dim flg As Variant Private Sub ComboBox3_Change() 'ComboBox4セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text KEY3 = Me.ComboBox3.Text Me.ComboBox4.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 Then ITE = .Cells(ico, 4).Value flg = 0 For I = 0 To Me.ComboBox4.ListCount - 1 If ITE = Me.ComboBox4.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox4.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox4.SetFocus End Sub

  • VB6で特定フォルダのCSVファイルを指定して開く

     お世話になります。  ある株価を記すCSVファイルを読んで、配列格納しようと下記プログラムを書いてみましたが、 この状態では「読み込み対象のファイル」が「このVBプロジェクト」と同じフォルダに入っていなければならないようです。    そこで C:\IR_NK\USDJPY_20071010.csv の USDJPY_20071010.csv を読むというように、「別のフォルダのファイル」を読み込むように書き換えたいです。  この場合、どのように書けばいいか教えて欲しいです。 Private Sub C_FJU() Dim H_R(2) As Integer Dim HI_R(2, 8000) As String Dim intFileNo As Integer Dim strTextLine As String Dim strTxtDat As String intFileNo = FreeFile Open "USDJPY_20071010.csv" For Input As #intFileNo Do While Not EOF(intFileNo)  Input #intFileNo, strTextLine H_R(0) = H_R(0) + 1 HI_R(0, H_R(0)) = Trim(strTextLine) strTxtDat = strTxtDat & strTextLine & vbCrLf Loop T_HYO.Text = strTxtDat  Close #intFileNo End Sub

  • VB2008 comboboxを連動させた際のエラー

    先日より取り組んでいる顧客検索プログラムですが、combobox1でササキを選ぶとcombobox2には北海道、combobox3には札幌市と表示させたいと思います。先日もアドバイスをいただきそれを参考にすすめていますが、「'0' の InvalidArgument=Value は 'SelectedIndex' に対して有効ではありません。 パラメータ名: SelectedIndex」というエラーが出てしまいどうしても解決出来ません。このエラーの後さらにデバッグすると思ったとおりに動作するのですが、エラーを解決するにはどう対処すると良いのでしょうか?下記が現在のソースとなります。どうかアドバイスをお願い致します。 ササキ,北海道,札幌市, スズキ,東京都,あきる野市, サトウ,愛知県,名古屋市, ハヤシ,北海道,旭川市, が TextFile1.txtです。 Imports System.IO ------------ Public Class Form1 Private Sub Form1_Load(省略~ Dim fn As String = "C:\TextFile1.txt" Dim read As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(fn, System.Text.Encoding.Default) Dim dline() As String Dim namelist As ArrayList = New ArrayList() Dim adr1list As ArrayList = New ArrayList() Dim adr2list As ArrayList = New ArrayList() dline = Split(read.ReadToEnd, vbCrLf) Dim srcary() As String Dim i As Integer For i = LBound(dline) To UBound(dline) srcary = Split(dline(i), ",") namelist.Add(srcary(0)) adr1list.Add(srcary(1)) adr2list.Add(srcary(2)) Next ComboBox1.DataSource = namelist ComboBox1.SelectedIndex = -1 ComboBox1.Text = "名前" ComboBox2.DataSource = adr1list ComboBox2.SelectedIndex = -1 ComboBox2.Text = "住所1" ComboBox3.DataSource = adr2list ComboBox3.SelectedIndex = -1 ComboBox3.Text = "住所2" End Sub ------------- Private Sub ComboBox1_SelectedIndexChanged(省略~ If ComboBox1.SelectedIndex > -1 Then ComboBox2.SelectedIndex = ComboBox1.SelectedIndex Else ComboBox2.Text = "" End If End Sub