• 締切済み

カンマ区切りの文字列をDatasetに登録するには?【VB.NET2005】

テキストファイルを読込んでカンマ区切りでDatasetに登録する際は 以下の方法で行っていました。 Dim tfp As New TextFieldParser(fileName, System.Text.Encoding.GetEncoding("Shift_JIS")) Dim dt As New DataTable Dim dr As DataRow tfp.TextFieldType = FieldType.Delimited tfp.SetDelimiters(",") While Not tfp.EndOfData dr = dt.NewRow dr.ItemArray = tfp.ReadFields dt.Rows.Add(dr) End While tfp.Close() ds.Tables.Add(dt) これをファイルではなくDim str As String = "123,aaa" という文字列に対して行いたいのですが、 上記のReadFieldsの用に使える物は無いでしょうか?

noname#82904
noname#82904

みんなの回答

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.3

もとがCSVファイルのようですので、OleDBによるアクセスも可能です。 DGV.DataSource = Nothing Try Dim oConn As New OleDbConnection() Dim oCommand As New OleDbCommand() Dim oDataSet As New DataSet() Dim oDataAdapter As New OleDbDataAdapter() Dim filePath As String = Nothing Dim fileNames As String = Nothing Dim SQL As String = Nothing filePath = GetDirectoryName(fileName) fileNames = GetFileName(fileName) 'DB接続文字列の設定 'CSVファイルにタイトル行を含まない場合はHDR=NOにしてください oConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + _ "Data Source=" + filePath + "\;" + _ "Extended Properties=""Text;HDR=YES;FMT=Delimited""" oCommand.Connection = oConn SQL = "SELECT * FROM " & fileNames oCommand.CommandText = SQL oConn.Open() 'データを取得する oDataAdapter.SelectCommand = oCommand oDataSet.Clear() oDataAdapter.Fill(oDataSet) DGV.DataSource = oDataSet.Tables(oDataSet.Tables(0).ToString) oConn.Close() Catch oExcept As Exception '例外が発生した時の処理 MessageBox.Show(oExcept.Message, "例外発生") End Try

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

1点訂正 dim enc as System.Text.Encoding.Defualt では無く dim enc as System.Text.Encoding = System.Text.Encoding.Defualt でした m(__)m

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

元の文字列をEncodingクラスのGetBytesでByte配列に変換して それをMemoryStreamを使ってTextFieldParserオブジェクト構築すればいいのでは dim str as String = "123,aaaa" dim buf as byte() dim enc as System.Text.Encoding.Defualt buf = enc.GetBytes( str ) dim MemStream as new MemoryStream( buf, False ) dim tfp as new TextFieldPerser( MemStream, enc ) といった具合で ...

関連するQ&A

  • TextFieldParserで"含むファイルを

    c sharp、Visual Studio 2015でコーディングしています。 TextFieldParserでtsvを読み込みたいのですが、ケースにより エラーが出て困っています。 using (TextFieldParser parser = new TextFieldParser(filePath, Encoding.GetEncoding("utf-8"))) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters("\t"); //タブ区切り while (!parser.EndOfData) { // 1行読み込み string[] row = parser.ReadFields(); ←ここでエラーになる } } tsvファイルにダブルクォーテーションが含まれているとエラーになってしまうようです。 回避する方法はないでしょうか? tsvは以下のように記述されています。 "aaa bbb" 1 2 3 4

  • CSVファイルの処理

    TextData = New Microsoft.VisualBasic.FileIO.TextFieldParser(FileName, System.Text.Encoding.Default) TextData.TextFieldType = FileIO.FieldType.Delimited TextData.SetDelimiters(",") TextData.TrimWhiteSpace = False While Not TextData.EndOfData Dim row() As String = TextData.ReadFields() For Each field In row       ・       ・       ・   Next End While こんな形でCSVファイルを読み出しているのですが、 カンマで区切られていても値の入っていないデータ(セル)は forループ内を通らず読み飛ばされ、次のデータの処理をしてしまいます。 ※例えば下記のようなCSVだったとすると、 野球 ,, サッカー , バスケ 処理は4回行ってほしいのに、2つ目の何もない箇所はとばされて 処理は3回しか行われません。 カンマで区切られていれば値が入っていなくとも処理を行うにはどうすればよいでしょうか?

  • データベースのDataRowの使い方について

    環境: Windows7 MicrosftVisualStudio 2013 SQLServer 2014 言語 C# .Net 通常以下のようにしてDataRowを作って使用しますが、 DataSet ds = new DataSet(); DataTable dt = new DataTable("Table1"); dt.Columns.Add("商品番号"); dt.Columns.Add("商品名"); dt.Columns.Add("価格"); ds.Tables.Add(dt); DataRow datarow = ds.Tables["Table1"].NewRow(); データソースと同じ列を使用したいので データセット  : MAINDataSet データテーブル : MASTERDataTable MAINDataSet.MASTERDataTable dtMaster = new MAINDataSet.MASTERDataTable(); として新規作成を行ったのですが、このままではレコード数が0で、上記の DataRow datarow = dataset.Tables["Table1"].NewRow(); にあたる処理 DataRow dr = MAINDataSet.MASTERDataTable.NewRow(); がわかりません。 現状では この1行の代わりに以下のようなことを毎回しなければ ならないのでしょうか? MAINDataSet.MASTERDataTable dt = new MAINDataSet.MASTERDataTable(); DataSet ds = new DataSet(); DataTable dt = new DataTable("Table1"); for(int inum = 0; inum < dt.Columns.Count; inum++) { dt.Columns.Add(dt.Columns[inum].ColumnName); } ds.Tables.Add(dt); DataRow datarow = ds.Tables["Table1"].NewRow();

  • VB2010 DataGridVie CSV読込

    VB2010で出勤簿を作っています。 社員名簿と出勤簿がDataGridviewで作成され、社員名簿のDataは出勤簿に連動しています。 このDataGirdViewのDataを別のPCにある出勤簿でも使えるようにしたいので、素人考えでCSV形式で保存して、FDに移して別のPCに入れて使ことにしました。(CSV形式でなくても、移動できるのでしたら、そうしたいのですが、方法が分からないので、仕方なくCSV形式を選びました) いろいろ勉強しまして、保存方法は習得しましたが、CSVを読み込む際に、 [コントロールがデータバインドされているとき、DataGridView の行コレクションにプログラムで行を追加することはできません。] というエラーが出ました。 対処方法をご存知の方が居られましたら、ご教授ください。 コードを記載します。 Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click Dim parser As TextFieldParser = New TextFieldParser("savekyoto.csv", Encoding.GetEncoding("Shift_JIS")) parser.TextFieldType = FieldType.Delimited parser.SetDelimiters(",") ' 区切り文字はコンマ '出勤簿のDATAを初期化する Dim j As Integer For j = 0 To Me.DataGridView1.Rows.Count - 2 Me.DataSet11.出勤簿.Rows(j).Delete() Next While (Not parser.EndOfData) Dim row As String() = parser.ReadFields() ' 1行読み込み ' 読み込んだデータ(1行をDataGridViewに表示する) DataGridView1.Rows.Add(row) End While End Sub

  • VB.NETで、配列をテーブルに変換する。

    VB.NETで、一次元配列string()にあるデータを、DataTableに変換 したいのですが、「型'String'の値を'System,Data,DataTable'に変換できません。」 と、エラーが発生してしまいます。 s1に、配列データが入っています。 Dim dt As DataTable Dim cnt As Integer Dim i As Integer dt = New DataTable count = s1.Length For i = 0 To cnt - 1 dt = CType(s1(i), DataTable) Next 解決方法が見つからず、行き詰っております。 宜しくお願い致します。

  • TextFieldParserの固定長桁数をバイト単位で指定したい

    TextFieldParserによる固定長テキストファイルの読込で、 桁数を文字数ではなく「byte数」で指定する方法を教えてください。 (FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です) 以下に、文字数指定による読込のコードを記述します。 よろしくお願いします。 'VBのコード-----------------------------------------------   Public Shared Sub Main()     Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))       reader.TextFieldType = FieldType.FixedWidth       reader.SetFieldWidths(2, 7, 2)       Dim currentFields() As String       While Not reader.EndOfData         Try           currentFields = reader.ReadFields() ' 一行読込           Dim currentField As String           For Each currentField In currentFields             Trace.WriteLine(currentField)           Next         Catch ex As MalformedLineException           MessageBox.Show(ex.Message)         End Try       End While     End Using   End Sub 'VBのコード ここまで------------------------------------ <読み込む固定長ファイル> 01やまだいちろう26 02やまだじろう 23 <実行結果> 01 やまだいちろう 26 02 やまだじろう 23 >reader.SetFieldWidths(2, 7, 2) この部分を >reader.SetFieldBytes(2,14,2) '関数名は適当 このように指定できないか、と考えています。

  • VB.NETからアクセス

    お世話になります。ちょっと急ぎでお聞きしたいのですが、アクセスの、あるテーブルに新しい行を追加したくて次のように記述すると、「更新には、新しい行を含むDataRowコレクションが渡されたとき、有効なINSERT COMMANDが必要です。」とでました。 Dim rw As DataRow rw = DataSet11.Tables(1).NewRow rw.Item("年") = "2004" rw.Item("月") = "10" DataSet11.Tables(1).Rows.Add(rw) OleDbDataAdapter1.Update(DataSet11) なにか良い解決方法はあるでしょうか?  すみません、よろしくお願いします。

  • WEBアプリでデータを書き込む

    visual web developerを使用してwebアプリケーションを作っています。 住所氏名一覧表に、 あらたに住所氏名を加えていく入力フォームを作成しています。 すべてのデータにIDを自動出来に加えたいのですが 元データをXMLファイルにすると 自動でIDをふる方法がわかりません。 元データをACCESSファイルにすると データの「登録」ボタンを押した際 ”別のプロセスで使用されているため、プロセスはファイル××にアクセスできません。” と出てしまいます。 できれば後者の方法(ACCESS形式)で運用したいのですが のどようにすればいいのでしょうか? 教えてください! 以下は「登録」ボタンのコードです。 Protected Sub Button_Add_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button_Add.Click ' データベースファイルのパスを定義する Dim UpFolder_URL As String = "~/Chap4/Upload_data/" Dim UpFolder As String = Server.MapPath(UpFolder_URL) Dim DBFile As String = UpFolder + "database.mdb" ' データベースのデータを読み込む Dim albumDS As New Data.DataSet() albumDS.ReadXml(DBFile) Dim table As Data.DataTable = albumDS.Tables("item") ' 新しい行をテーブルに追加する Dim newRow As Data.DataRow = Table.NewRow() newRow("Date") = DateTime.Today.ToLongDateString() newRow("Name") = Name.Text newRow("Contents") = Contents.Text newRow("Add") = Add.Text newRow("Method") = Method.Text table.Rows.Add(newRow) ' データをデータベースファイルに書き出す albumDS.WriteXml(DBFile) ' GridViewの表示を更新する GridView1.DataBind() End Sub

  • DataSet(DataTable)の使い方

    GridViewやListViewなどに動的にデータを追加していきたいので、 DataTableを使おうと思いました。 下記、(1)のようにPageLoadイベントで1行追加することはできたのですが、 ボタンを押すごとに、1行ずつ追加していきたいので(2)のように修正したのですが、 ボタンを押したときのポストバックで、DataSetもDataTableもnullになってしまい、 行の追加ができません。 ボタンを押すごとにどんどん行を追加していきたいのですが、このような場合は どのようにDataSetもDataTableを保持しておけば良いのでしょうか。 (1) public partial class WebForm1 : System.Web.UI.Page { int count = 0; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet dS = new DataSet("dS"); DataTable dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } } } (2) public partial class WebForm2 : System.Web.UI.Page { int count = 0; DataSet dS; DataTable dT; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { dS = new DataSet("dS"); dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); } } protected void Button1_Click(object sender, EventArgs e) { count = count + 1; DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } }

  • コンボボックスに固定値をセットして表示する方法

    お世話になります。さっそくですが、質問です。 現在、VB.NET 2008で開発を行ってます。 質問の目的は、 実行プログラムにおいて、 画面に配置したコンボボックスをクリックした際、 以下の値を選択肢として表示させることです。 (【性別】の選択肢) ・男性 ・女性 Form_Load()時に、コンボボックスに上記の値を固定でセットしています。 ------------------------------------------------- Public Function getDataField1() As DataSet '変数宣言 Dim ds As DataSet Dim dt As New DataTable Dim dr As DataRow dt.Columns.Add("DataTextField", GetType(String)) dt.Columns.Add("DataValueField", GetType(String)) '空白セット dr = dt.NewRow() dr("DataTextField") = "      " dr("DataValueField") = ",,,," dt.Rows.Add(dr) dr = dt.NewRow() dr("DataTextField") = "1" dr("DataValueField") = "男性" dt.Rows.Add(dr) dr = dt.NewRow() dr("DataTextField") = "2" dr("DataValueField") = "女性" dt.Rows.Add(dr) ds = New DataSet ds.Tables.Add(dt) Return ds End Function Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ds As DataSet '性別の取得 ds = getDataField1() For i As Integer = 0 To 2 cmb_性別.Items.Add() ds.Tables(0).Rows(i).Item("DataValueField").ToString() Next i End Sub ------------------------------------------------- 上記内容の場合、コンボボックスをクリックしても 選択肢としては"空白"しか表示されません。 セットした値をコンボボックスの選択肢として表示させる方法を ご存知の方がいらっしゃいましたら、ご教授願えますでしょうか?

専門家に質問してみよう