DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | Nomal時間変数(文字列)の扱い(4) | NomalVB.net からAccessDBへの接続(2) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | NomalPictureBoxの画像を連続保存(11) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | Nomalラジオボタンの一括設定(7) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | Nomalc#で日付型の定義の仕方で質問があります。(2) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | NomalLableのカラー色を文字変数から変更したい(5) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | NomalLoadOptionのパラメータの意味(3) | Nomalフォーム背景のみを半透明にしたい(5) | Nomal読み出し元フォームの位置取得方法(2) | Nomalコンストラクターに続く{}の意味(2) | Nomal1行で書くことできますか?(3) | NomalCommandBuilderによって作られるCommandTextの内容(5) | Nomalvb.netで7zの圧縮・解凍をしたい。(2) | NomalC# NASでのプログレスバー有りのコピー(0) | Nomal正規表現で文字の繰り返しパターン(4) | NomalDataViewのFindRowsde(7) | NomalNPOIでのエクセル編集で期待通りに書き込めません(2) | NomalDataGridのSetDataBindingに代わるもの?(3) | NomalFormのサイズ変更で掴める辺を制限したい(2) | NomalVSTOとWebView2の共存って可能?(3) | Nomalビデオ圧縮のコーデック(2) | NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(3) | Nomal"−"を縦書きにしたい(9) | Nomal.NET6.0 のWinFormにWPFのユーザーコントロールを配置したい(4) | NomalDataGridViewの列にコンボボックスを表示する(2) | Nomalデータグリッドビューの特定の列ヘッダの色(2) | NomalVB-Report10→11への移行(4) | Nomal入力値を元に描画させたい(2) | Nomalデフォルトプリンタの用紙向き変更(0) | NomalpictureBoxとlabelの重ね合わせ(2) | NomalASP.net デバッグ時の .js ファイルの変更が反映されない(1) | NomalVBで開いたExcelでのイベントを取得するには(4) | NomalWindowsエクスプローラへのドロップ先フォルダの取得(4) | NomalデザイナでSystemColorsのような色一覧から選択できるようにしたい(0) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(2) | NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalDataGridViewのセル結合部分にボタンを表示する方法(2) | NomalTask.Runの使い方(4) | Nomalランダムファイルを高速化させたい(5) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) |



■記事リスト / ▼下のスレッド
■35088 / 親記事)  CommandBuilderによって作られるCommandTextの内容
□投稿者/ Wan 付き人(66回)-(2022/06/28(Tue) 12:10:57)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    VisualStudio2019で、データベースの使用を勉強しています。
    Accessに接続して、OleDbCommandBuilderを実行したところ、コメントのようなCommandTextを取得することができました。
    UPDATE文、DELETE文のCommandTextの中の(? = 1 AND 苗字 IS NULL)の意味を教えて頂けませんか?
    「苗字 IS NULL」は、レコードの苗字列の値がDbNullの場合はTrueを返すという事は理解していますが、「? = 1」の意味が解りません。
    
    詳しい方、宜しくお願い致します。
    
    (Accessのテーブル構成)
    インスタンス名	Access2010
    データベース名	データベース勉強用DB
    論理テーブル名	Test
    物理テーブル名	INSERT文.accdb
    
    列定義
    No	論理名	物理名	データ型	Null許容	主キー
    1	ID	ID	長整数(8,0)	No	    Yes
    2	苗字	苗字	テキスト型(10)	No	
    3	名前	名前	テキスト型(10)	No	
    4	年齢	年齢	十進数(18)	No	
    
    Dim oledb As String = "Microsoft.ACE.OLEDB.16.0;"
    Dim acfile As String = "D:\データベース勉強用DB\INSERT文.accdb"
    Dim Cn As New OleDb.OleDbConnection($"Provider={oledb} Data Source={acfile}")
    Dim Da As New OleDbDataAdapter("SELECT * FROM 既存テーブル", Cn)
    Dim Ds As New DataSet
    Da.Fill(Ds, "Test")
    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(Da)
    Dim INS_Cmd = builder.GetInsertCommand()
    Dim UPD_Cmd = builder.GetUpdateCommand()
    Dim DEL_Cmd = builder.GetDeleteCommand
    
    以下のCommandTextが設定されます。
    'INS_ Cmd.CommandText : INSERT INTO 既存テーブル (苗字, 名前, 年齢) VALUES (?, ?, ?)
    
    'UPD_ Cmd.CommandText :UPDATE 既存テーブル SET 苗字 = ?, 名前 = ?, 年齢 = ? 
    WHERE ((ID = ?) AND 
    ((? = 1 AND 苗字 IS NULL) OR (苗字 = ?)) AND 
    ((? = 1 AND 名前 IS NULL) OR (名前 = ?)) AND 
    ((? = 1 AND 年齢 IS NULL) OR (年齢 = ?)))
    
    ' DEL_Cmd.CommandText:DELETE FROM 既存テーブル 
    WHERE ((ID = ?) AND 
    ((? = 1 AND 苗字 IS NULL) OR (苗字 = ?)) AND 
    ((? = 1 AND 名前 IS NULL) OR (名前 = ?)) AND 
    ((? = 1 AND 年齢 IS NULL) OR (年齢 = ?)))
    
    

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■35089 / ResNo.1)  Re[1]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ 魔界の仮面弁士 大御所(1430回)-(2022/06/28(Tue) 14:16:04)
  • アイコンNo35088に返信(Wanさんの記事)
    > UPDATE文、DELETE文のCommandTextの中の(? = 1 AND 苗字 IS NULL)の意味を教えて頂けませんか?

    データベース側では、名前や型を明示したパラメーターをサポートしているのですが、
    OleDbConnection オブジェクトからだと、無名パラメーターしか使えないんですよね…。
    ACEDAO 経由で呼ぶ場合は名前付きにできるのですが。
    https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/parameters-declaration-microsoft-access-sql


    > 「苗字 IS NULL」は、レコードの苗字列の値がDbNullの場合はTrueを返すという事は理解していますが、「? = 1」の意味が解りません。

    空文字列と NULL を区別するための措置です。

    たとえば
     WHERE (? = 1 AND 苗字 IS NULL) OR (苗字 = ?)
    という部分を
     WHERE ([引数1] = 1 AND 苗字 IS NULL) OR (苗字 = [引数2])
    のように読み替えてみます。

    そのうえで、VB 側からは
     Dim 引数1 As Integer, 引数2 As String
     If NULLをセットしたい場合 Then
      引数1 = 1
      引数2 = Nothing '未使用
     Else
      引数1 = 0
      引数2 = TextBox1.Text
     End If
    のような引数が渡されるイメージです。
違反を報告
引用返信
■35090 / ResNo.2)  Re[2]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ Wan 付き人(67回)-(2022/06/28(Tue) 20:14:25)
  • アイコン
    魔界の仮面弁士様
    いつも丁寧がご指導ありがとうございます。
    
    折角教えて頂いたのですが、私の理解力が追いつきません。
    CommandBuilderで、CommandTextを取得した時にに設定されるParameterのプロパティは次のようになっています。
    DeleteCommanndのみ記載
    Paramete
    Name	DbType	OleDbType	SourceColumn	Direction	SourceVersion	Value
    p1	Int32{11}	Integer{3}	ID	Input{1}	Original{256}	Nothing
    p2	String(16)	VarWChar{202}	苗字	Input{1}	Original{256}	Nothing
    p3	String(16)	VarWChar{202}	苗字	Input{1}	Original{256}	Nothing
    p4	String(16)	VarWChar{202}	名前	Input{1}	Original{256}	Nothing
    p5	String(16)	VarWChar{202}	名前	Input{1}	Original{256}	Nothing
    p6	Decimal(7)	Numerid{113}	年齢	Input{1}	Original{256}	Nothing
    p7	Decimal(7)	Numerid{113}	年齢	Input{1}	Original{256}	Nothing
    
    これを見ると、引数1と引数2は同じ値になり、しかも、苗字と名前に関してはString型と1の比較を行っていることになります。
    Dim Str1 As String = "山田"
    If Str1 = 1 Then
     〜省略〜
    End If
    とすると: 'String "山田" から型 'Double' への変換は無効です。'
    となります。
    SQL文では、文字列と数値が比較できるのでしょうか?
    お手を煩わせます。

違反を報告
引用返信
■35091 / ResNo.3)  Re[1]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ 魔界の仮面弁士 大御所(1431回)-(2022/06/28(Tue) 20:51:37)
  • アイコン
    No35088に返信(Wanさんの記事)
    > 'UPD_ Cmd.CommandText :UPDATE 既存テーブル SET 苗字 = ?, 名前 = ?, 年齢 = ? 
    > WHERE ((ID = ?) AND 
    > ((? = 1 AND 苗字 IS NULL) OR (苗字 = ?)) AND 
    > ((? = 1 AND 名前 IS NULL) OR (名前 = ?)) AND 
    > ((? = 1 AND 年齢 IS NULL) OR (年齢 = ?)))
    
    No35089 の機能は、SourceColumnNullMapping プロパティによって制御されています。
    
    Dim sb As New System.Text.StringBuilder()
    sb.AppendLine($"UpdateCommand のパラメータ数={UPD_Cmd.Parameters.Count}")
    For Each p As OleDbParameter In UPD_Cmd.Parameters
        sb.Append($"{p.ParameterName,-4}{vbTab}")
        sb.Append($"{p.SourceVersion,-8}{vbTab}")
        sb.Append($"{If(p.SourceColumnNullMapping, "T", "F")}{vbTab}")
        sb.Append($"{p.OleDbType,-8}{vbTab}")
        sb.AppendLine($"{p.SourceColumn}")
    Next
    Debug.WriteLine(sb.ToString())
    
    上記を実行すると、このような表が得られます。
    p1,p5,p6 の違いに着目してみてください。
    
    ================================================
    UpdateCommand のパラメータ数=10
    p1    Current    F   VarWChar  苗字
    p2    Current    F   VarWChar  名前
    p3    Current    F   Numeric   年齢
    p4    Original   F   Integer   ID
    p5    Original   T   Integer   苗字
    p6    Original   F   VarWChar  苗字
    p7    Original   T   Integer   名前
    p8    Original   F   VarWChar  名前
    p9    Original   T   Integer   年齢
    p10   Original   F   Numeric   年齢
    ================================================
    
    Original は SELECT した時点の元の値を意味し、
    Current は、これから反映させたい編集後の値です。
    
    「p5 と p6」「p7 と p8」「p9 と p10」では、
    SourceColumn は同じですが、
    SourceColumnNullMapping が異なっていますよね。これが
     (? = 1 AND {SourceColumn} IS NULL) OR ({SourceColumn} = ?)
    の正体となります。
    
    
    --- 以下蛇足 ---
    > インスタンス名	Access2010
    Access 2010 世代のプロバイダー名は、本来は
    "Microsoft.ACE.OLEDB.12.0" ですね。もちろん
    "Microsoft.ACE.OLEDB.16.0" からでもアクセス可能ですが。
    
    
    > Dim oledb As String = "Microsoft.ACE.OLEDB.16.0;"
    oledb という変数名を付けて後で、それと同名の
    > Dim Cn As New OleDb.OleDbConnection(…
    な OleDb 名前空間を記述されていますね。
    名前が被って分かりにくくなりませんか?
    
    それ以外の
    > Dim Da As New OleDbDataAdapter(…
    > Dim builder As OleDbCommandBuilder = …
    では、OleDb. が無い状態にそろえてあるのに対し、
    oledb 変数名が必要なところだけが意図的に
    OleDb. 付きの表記なので、ちょっと混乱しそうです。
    もちろん、文法的には問題ないのですけれども。
    
    
    > Dim Cn As New OleDb.OleDbConnection($"Provider={oledb} Data Source={acfile}")
    プロバイダー名にセミコロンを入れるのは不自然ですね。
     Dim oledb As String = "Microsoft.ACE.OLEDB.16.0;"
     $"Provider={oledb} Data Source={acfile}"
    よりは
     Dim oledb As String = "Microsoft.ACE.OLEDB.16.0"
     $"Provider={oledb};Data Source={acfile}"
    の方が好ましいですよ。他のパラメーターもセミコロン区切りなので。
    
    実際のところ、接続文字列は
     Dim csb As New OleDbConnectionStringBuilder()
     csb.Provider = "Microsoft.ACE.OLEDB.16.0"
     csb.DataSource = "D:\データベース勉強用DB\INSERT文.accdb"
     Dim Cn As New OleDbConnection(csb.ConnectionString)
    のようにして組み立てることもできるのですが、この際に
     csb.Provider = "Microsoft.ACE.OLEDB.16.0;"
    としてしまうと、正しく接続できなくなります。
    
    
    > Dim Da As New OleDbDataAdapter("SELECT * FROM 既存テーブル", Cn)
    [既存テーブル] なのですね。冒頭の記述から [Test] かと誤解してました。
    
    > (Accessのテーブル構成)
    > インスタンス名	Access2010
    > データベース名	データベース勉強用DB
    > 論理テーブル名	Test
    > 物理テーブル名	INSERT文.accdb

違反を報告
引用返信
■35092 / ResNo.4)  Re[2]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ 魔界の仮面弁士 大御所(1432回)-(2022/06/28(Tue) 21:11:34)
  • アイコン
    No35091に追記(魔界の仮面弁士の記事)
    > No35089 の機能は、SourceColumnNullMapping プロパティによって制御されています。
    
    おぉ。追加説明のコードを書いているうちに、
    ピンポイントでその点についての追加質問が投稿されていた…!
    
    
    SQL における「列名 = 値」という記述について考えてみます。
    
    SET などの『代入処理』の場合は、
    値が null/非null いずれでも、「列名 = 値」と書けます。
    
    しかし、WHERE などの『比較処理』の場合は、
    「列名 = NULL」では TRUE 判定されないため、
    「列名 = 非NULL値」と「列名 IS NULL」を使い分けねばなりません。
    そのための仕組みです。
    
    
    ついでなので、DELETE と INSERT のケースも載せておきます。
    
    DeleteCommand のパラメータ数=7
    p1      Original    F   Integer     ID
    p2      Original    T   Integer     苗字
    p3      Original    F   VarWChar    苗字
    p4      Original    T   Integer     名前
    p5      Original    F   VarWChar    名前
    p6      Original    T   Integer     年齢
    p7      Original    F   Numeric     年齢
    
    
    InsertCommand のパラメータ数=3
    p1  	Current 	F	VarWChar	苗字
    p2  	Current 	F	VarWChar	名前
    p3  	Current 	F	Numeric 	年齢
    
    
    DataTable 内のデータは、DataRowVersion によってバージョン管理されており、
    SELECT 直後の値(Original)と
    編集結果を考慮した現在値(Current)の 2 種類を持ちます。
    ※ DataRow の RowState プロパティも参照
    
    
    Original なパラメーターは、WHERE 句のために使われます。
    INSERT の場合は WHERE が無いので、Current のみです。
    
    逆に DELETE の場合は、現在値が存在しないため Current がなく
    Original だけになります。
    
    そして UPDATE の場合は、SET 句用の Current と
    WHERE 句用の Original の両方があるというわけです。

違反を報告
引用返信
■35097 / ResNo.5)  Re[3]: CommandBuilderによって作られるCommandTextの内容
□投稿者/ Wan 付き人(68回)-(2022/07/07(Thu) 09:46:35)
  • アイコン魔界の仮面弁士さま
    お礼が大変遅くなりすみません。
    下記の部分が理解できずに、色々勉強していました。

    > 「苗字 IS NULL」は、レコードの苗字列の値がDbNullの場合はTrueを返すという事は理解していますが、「? = 1」の意味が解りません。
    空文字列と NULL を区別するための措置です。

    取り合えず、データベースの列がNull許容型で、且つ、データがNullの場合Trueとすると理解してこの質問のFixとして、勉強を進める過程で、再度、質問するかもしれませんが、その時は宜しくお願い致します。

    丁寧に、コード迄書いていただいて有難うございました。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35093 / 親記事)  vb.netで7zの圧縮・解凍をしたい。
□投稿者/ かい 一般人(1回)-(2022/07/01(Fri) 10:08:11)
  • アイコン環境/言語:[VB.NET] 
    分類:[.NET] 

    vb.netプロジェクトに7zでファイル圧縮、解凍する機能を追加したいと思っております。
    7-ZIP32.DLLを使いたいと思ったのですがC#でのサンプルしか見つけられません。
    DotNetZipのように使えるものはあるのでしょうか?
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35094 / ResNo.1)  Re[1]: vb.netで7zの圧縮・解凍をしたい。
□投稿者/ KOZ 一般人(1回)-(2022/07/01(Fri) 15:20:48)
  • アイコンNo35093に返信(かいさんの記事)
    > 7-ZIP32.DLLを使いたいと思ったのですがC#でのサンプルしか見つけられません。

    C# のサンプルがあるなら
    https://converter.telerik.com/
    で VB.NET に変換してみてはいかがでしょう
違反を報告
引用返信
■35096 / ResNo.2)  Re[1]: vb.netで7zの圧縮・解凍をしたい。
□投稿者/ kiku 一般人(1回)-(2022/07/06(Wed) 16:31:39)
  • アイコンNo35093に返信(かいさんの記事)
    > vb.netプロジェクトに7zでファイル圧縮、解凍する機能を追加したいと思っております。
    > 7-ZIP32.DLLを使いたいと思ったのですがC#でのサンプルしか見つけられません。
    > DotNetZipのように使えるものはあるのでしょうか?

    だいぶ古い記事ですが、下記が参考になりそう。
    https://www.petitmonte.com/bbs/answers?question_id=28055
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35087 / 親記事)  C# NASでのプログレスバー有りのコピー
□投稿者/ しゃーしょ 一般人(1回)-(2022/06/24(Fri) 11:57:02)
  • アイコン環境/言語:[WIN11 C# .NET Framework 4.8.4515.0] 
    分類:[.NET] 

    WIN11 vs2022 C# フォームアプリ
    
    c#初心者です。
    ファイルをコピーし、進捗をプログレスバーで表わすコードを勉強しています。
    
    下記コードでは、パソコン内蔵HDDやUSB外付けHDDでは期待通り動きますが、NASネットワーク ハードディスクだとコピーできません。
    プログレスバーを貼ったフォームが表示された状態で、ブログレスバーが動くこともなく止まってしまいます。
    
    formProgress.Show();をコメントアウトすればコピーできます。
    
    どうすればNASでも動くようになるのでしょうか?
    NASは初心者向け家庭用のIO-DATA製hdl2-taです。
    
    フォーム1
    public partial class Form1 : Form
        {   
            private void Form1_Load(object sender, EventArgs e)
            {
                var task = Task.Run(() =>
                {
                    Backup();
                });
            }
    
            void Backup()
            {
                FormProg formProgress = new FormProg();
                formProgress.Show();
    
                string path = @"t:\test1\test.txt";
                string destFilePath = @"t:\test2\test.txt";
    
                File.Copy(path, destFilePath);
    
                formProgress.progressBar1.Maximum = 2;
    
                formProgress.progressBar1.Value = 1;
            }
        }
    
    
    プログレスバーを貼り付けたフォーム
    public partial class FormProg : Form
        {        
            new public void Show()
            {
                Task.Run(() =>
                {
                    ShowDialog();
                });
            }
        }

違反を報告
引用返信



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35074 / 親記事)  正規表現で文字の繰り返しパターン
□投稿者/ ポポ 一般人(1回)-(2022/06/13(Mon) 10:30:35)
  • アイコン環境/言語:[Windows10 64bit VS2019 VB.NET .NET4.8.04084] 
    分類:[.NET] 

    はじめてお世話になります。

    正規表現で文字の置き換えについて教えて下さい。

    文字が繰り返されてしまっているデータを含んだテキストファイルがあります。
    例)”ああああいいいいううううええええおおおお 御中”
    上記例は”あいうえお”の部分5文字が各4回ずつの繰り返してしまっており、
    その後の” 御中”は繰り返していません。
    これを正しい”あいうえお”に置き換えをしたいです。

    文字数も繰り返し回数も不定です。ただし繰返し回数(例では4)は全文字同じ
    回数になります。

    正規表現で"(.)\1"として"$1"で1文字に置き換えはできたのですが、
    当然、2文字連続文字は全て置き換わります。(例えば2001年の00部分)
    (.)\1+(.)\2+", "$1$2"で2回の繰り返しの場合のみ置き換えで対応したのですが、
    3回以上の繰り返しを置き換えるのに、パターンを全て記述することになり困っております。

    同じ文字の繰り返しパターンが2回以上連続する場合に各1文字に置き換える
    表現が可能か、ご教授頂ければと存じます。
    よろしくお願いします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35082 / ResNo.1)  Re[1]: 正規表現で文字の繰り返しパターン
□投稿者/ shu 大御所(498回)-(2022/06/16(Thu) 08:46:43)
  • アイコンNo35074に返信(ポポさんの記事)

    全部同じ繰り返し回数というのが条件でしょうか?
    ああああいいいうううううえええ

    だとしたらどのように変換するのがただしいのでしょうか?
違反を報告
引用返信
■35083 / ResNo.2)  Re[2]: 正規表現で文字の繰り返しパターン
□投稿者/ shu 大御所(499回)-(2022/06/16(Thu) 10:00:29)
  • アイコン
    サンプルです。
    a:元の文字列
    b:連続した文字を1文字に変換
    c:連続数の一番少ない文字に合わせて変換
    
            Dim a = "ああああいいいいううううえええお"
            Dim reg1 As New Regex("(?<c>.)\k<c>+")
    
            Dim b = reg1.Replace(a, Function(m) m.Groups("c").Value)
    
            Dim min = a.Length
            reg1.Replace(a, Function(m)
                                Dim l = m.Value.Length
                                If l < min Then
                                    min = l
                                End If
                                Return ""
                            End Function
                         )
    
            Dim c = reg1.Replace(a, Function(m)
                                        Dim l = m.Value.Length
                                        Dim c1 = m.Groups("c").Value
                                        Dim nm = l - min + 1
                                        Return New String(c1, nm)
                                    End Function
                         )
    

違反を報告
引用返信
■35085 / ResNo.3)  Re[2]: 正規表現で文字の繰り返しパターン
□投稿者/ ポポ 一般人(2回)-(2022/06/18(Sat) 15:54:42)
  • アイコンNo35082に返信(shuさんの記事)
    > ■No35074に返信(ポポさんの記事)
    >
    > 全部同じ繰り返し回数というのが条件でしょうか?
    > ああああいいいうううううえええ
    >
    > だとしたらどのように変換するのがただしいのでしょうか?
    全て同じ文字数の繰り返しが条件ですので、
    4文字、3文字、4文字、3文字パターンの場合は変換しません。
違反を報告
引用返信
■35086 / ResNo.4)  Re[3]: 正規表現で文字の繰り返しパターン
□投稿者/ ポポ 一般人(3回)-(2022/06/18(Sat) 16:01:18)
  • アイコンNo35083に返信(shuさんの記事)
    ありがとうございます。
    やはり正規表現のみで対応はできないのですね。

    iTextSharpでpdfファイルからテキスト抽出した際、
    同じ文字数の繰り返し文字列が返ってきてしまう場合があり、
    これの対処をしておりました。
    正規表現1行でできないかと格闘していた次第です。

    上記参考にさせてお頂きます。
    ありがとうございました。

違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-4]



■記事リスト / ▲上のスレッド
■35075 / 親記事)  DataViewのFindRowsde
□投稿者/ Wan 付き人(62回)-(2022/06/15(Wed) 17:49:25)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    DataViewについて勉強しています。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.data.dataview.find?view=net-6.0#system-data-dataview-find(system-object())
    のページに次のコードがかかれています。
    Private Sub FindValueInDataView(table As DataTable)
        Dim view As New DataView(table)
        view.Sort = "Customers"
        Dim vals(1) As Object
        vals(0)= "John"
        vals(1) = "Smith"
        Dim i As Integer = view.Find(vals)
        Console.WriteLine(view(i))
    End Sub
    これを参考に次のコードを作成しました。
    Dim myTable As New DataTable
    Dim myColumn As DataColumn
    myColumn = New DataColumn("FirstName")
    myTable.Columns.Add(myColumn)
    myColumn = New DataColumn("LastName")
    myTable.Columns.Add(myColumn)
    Dim myRow As DataRow
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"佐々木", "渉"}
    myTable.Rows.Add(myRow)
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"山本", "健司"}
    myTable.Rows.Add(myRow)
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"山本", "弘子"}
    myTable.Rows.Add(myRow)
    myRow = myTable.NewRow
    myRow.ItemArray = New Object() {"森本", "武"}
    myTable.Rows.Add(myRow)
    Dim myDataView As New DataView(myTable)
    myDataView.Sort = "FirstName"
    Dim test = myDataView.FindRows(New Object() {"山本", "健司"}) '@
    'Dim test = myDataView.FindRows("山本") 'A
    'DataGridView1.DataSource = test 'A
    を作成しました。
    実行してみると、「System.ArgumentException: 'インデックスを付加するキーには 1 値が必要ですが、2 値を取得しました。'」の例外が発生します。
    サンプルコードとどこが違うのでしょうか?
    サンプルのコードが正しく動いた場合は、一つの列の値の中で、二つのKYのどちらかがマッチした場合の行が返されると考えて宜しいのでしょうか?
    
    また、@をコメントアウトして、Aをコメントを外すと例外は発生しませんが、
    DataGridViewに期待する内容が表示されません。
    DataRowView[]をDataGridViewに表示するには、どのようにすれば良いのでしょうか?
    どなたか詳しい方教えてください。
    宜しくお願い致します。
    
    
    
    

違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■35078 / ResNo.3)  Re[1]: DataViewのFindRowsde
□投稿者/ 魔界の仮面弁士 大御所(1429回)-(2022/06/15(Wed) 20:27:22)
  • アイコンNo35075に返信(Wanさんの記事)
    > 一つの列の値の中で、二つのKYのどちらかがマッチした場合の行が返されると考えて宜しいのでしょうか?

    FindRows メソッドでの検索は AND 条件です。
    OR 条件で抽出したい場合は、LINQ を使うことができます。

    Dim rowViews = (From r As DataRowView In myDataView Where r("FirstName") = "山本" OrElse r("LastName") = "健司").ToArray()
違反を報告
引用返信
■35079 / ResNo.4)  Re[2]: DataViewのFindRowsde
□投稿者/ Wan 付き人(63回)-(2022/06/16(Thu) 07:57:57)
  • アイコンHongliangさん
    魔界の仮面弁士さん

    いつもご指導ありがとうございます。
    サンプルでも間違えていることがあるんですね?
    色々やってみましたが、上手く行かず途方に暮れていました。
    助かりました。

    DataViewにLINQを使う時に、私ならつい
    From r As DataRowView In myDataView.Rows
    とRowsをつけてしまいそうですが、LINQ to DataSetの仕様という事でしょうか?
    また、r("FirstName")とColumn名が使えるのもLINQ to DataSetの仕様でしょうか?


    最後の質問である。
    DataRowView[]をDataGridViewに表示するには、どのようにすれば良いのでしょうか?
    は、どのようにすれば宜しいのでしょうか?
    追加で、ご指導頂ければ助かります。

違反を報告
引用返信
■35080 / ResNo.5)  Re[3]: DataViewのFindRowsde
□投稿者/ Wan 付き人(64回)-(2022/06/16(Thu) 08:05:30)
  • アイコン
    魔界の仮面弁士さんのコードに.ToArrayをつけて
    DataSouceに入れると図のようになってしまいます。
    
     Dim myDataView As New DataView(myTable) With {.Sort = "FirstName"}
     Dim test = myDataView.FindRows("山本").ToArray 'A
     DataGridView1.DataSource = test 'A
    
    宜しくお願い致します。
    

442×275 => 250×155
イメージ
dobon.jpg
/11KB
違反を報告
引用返信
■35081 / ResNo.6)  Re[4]: DataViewのFindRowsde
□投稿者/ Wan 付き人(65回)-(2022/06/16(Thu) 08:22:40)
  • アイコン.ToListならでました。
    根本的に?何を理解していないのか?
    わかりません?
違反を報告
引用返信
■35084 / ResNo.7)  Re[5]: DataViewのFindRowsde
□投稿者/ wan 一般人(5回)-(2022/06/16(Thu) 22:42:43)
  • アイコン解決しました
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]






Mode/  Pass/


- Child Tree -

2023/03/31(Fri) 15:54:53 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする