C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

csvデータへの追記

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■85770 / inTopicNo.1)  csvデータへの追記
  
□投稿者/ asa (1回)-(2017/11/22(Wed) 12:11:42)

分類:[VB.NET/VB2005 以降] 

ご質問です
やりたい事が上手くいかず悩んでいます
助言ください


@マスターデータをコピーして新しい名前でファイルを作成↓図参照






ALabelに入ってきた文字列を取得して新しいデータへ追記

Label1.text = B
Label2.text = 10 '追記データ


BFile.Appendで追記する

A
B,10
C
D

Cこれを何回も繰り返していくメソッド

図例

A,1
B,10,20,10
C,5
D

イベントはボタンです

今は、array.indexofで
マスターデータの配列からインデックスを取得して
追記用のデータに”B”の後に ,とデータをと思いますが
これでは元データ失われます

Dim i As Integer = Array.IndexOf(masterData, proda_name.Text)

File.AppendAllText("記述予定path", master(i) & "," &
Cut_timer.Text, enco)

ロジックを考える力が無く
今とまっている状態です

よろしくお願い致します。


引用返信 編集キー/
■85771 / inTopicNo.2)  Re[1]: csvデータへの追記
□投稿者/ shu (1069回)-(2017/11/22(Wed) 12:24:18)
No85770 (asa さん) に返信

提示された1から4のような書き換えを
行うには全体を書き換える必要があります。
行を追加していくなどファイル末尾に
足していくならその部分だけ追記することは出来ます。
引用返信 編集キー/
■85772 / inTopicNo.3)  Re[1]: csvデータへの追記
□投稿者/ WebSurfer (1358回)-(2017/11/22(Wed) 12:54:29)
No85770 (asa さん) に返信

対象とするファイルはテキストファイル(メモ帳などで作れるファイル)なのですか?

とすると shu さんが言われるように、既存のファイルの途中に入力したデータを割り込ませる
のは無理で、全部書き直しになってしまいます。

なので、B の操作のたびにファイルを全面書き直しするのでなく、例えば(あくまで例えば)
Dictionary<TKey, TValue> クラスなどを利用して @ から C はメモリ上で行い、C の操作が
終わったらメモリの内容をファイルに書き出すというのはいかがですか?
引用返信 編集キー/
■85773 / inTopicNo.4)  Re[2]: csvデータへの追記
□投稿者/ asa (2回)-(2017/11/22(Wed) 13:20:07)
No85772 (WebSurfer さん) に返信
> ■No85770 (asa さん) に返信

早速の助言ありがとうございます

メモリ上でやらなないとできないんですね
まだまだ勉強不足です。。。

要は、変数に追記していくデータをほりこんで
その形にしてから
書き出すみたいなことなんですか?

すいませんいまいちどうすればいいか
わからないので

実例を教えていただけると助かります。

引用返信 編集キー/
■85774 / inTopicNo.5)  Re[3]: csvデータへの追記
□投稿者/ WebSurfer (1359回)-(2017/11/22(Wed) 13:43:05)
No85773 (asa さん) に返信

> メモリ上でやらなないとできないんですね

できないということではなくて、B の操作のたびにファイルを全面書き直しするのは無駄が
多いということです。


> いまいちどうすればいいかわからないので実例を教えていただけると助かります。

分からないレベルが「いまいち」程度でしたら、ググればいろいろ情報を集められると思いま
すので、まずそれをやってみて、できらばある程度自分で実装してみて、その上でどうしても
分からない点を質問していただければと思います。

引用返信 編集キー/
■85777 / inTopicNo.6)  Re[3]: csvデータへの追記
□投稿者/ 本醸造 (5回)-(2017/11/22(Wed) 17:39:11)
No85773 (asa さん) に返信

こんな感じで
https://paiza.io/projects/N4pzHFRCezUOByj5BAWcpQ

masterの読み込みをcsvから行って
dic(x).Add(y)でラベルから取得した値を設定して
Console.WriteLineをファイルに書き出す感じによろしくやっていただければ
よろしくできるかと思います

引用返信 編集キー/
■85778 / inTopicNo.7)  Re[4]: csvデータへの追記
□投稿者/ asa (3回)-(2017/11/23(Thu) 11:11:55)
No85777 (本醸造 さん) に返信
> ■No85773 (asa さん) に返信
>

ありがとうございます
コードを見ながら勉強中ですが

とりあえず自分で考えながらやってみて
ここだけわからないのでご教授ください

private Sub log()

Dim T_Datas As New Dictionary(Of String, String)
Dim log_set As String = log_set.Text
Dim today As String = Date.Now.ToString("yyyy年MM年dd日(ddd)_ログ")
For Each s As String In name_s'元データ読込変数
T_Datas(s) = s
Next

T_Datas(val) = T_Datas(val) & "," & log.Text

File.WriteAllLines("path" & today & ".csv", T_Datas.Values,enco)

End Sub

とりあえず Dictionaryに For Eachにて
KeyとValueに 元データファイルを。。






を登録、その後
追記
Value値に追記できたのを

ファイル書き出しで、ディクショナリーのValue配列を書き出す
で1回目は成功しましたが

本来は、これが繰り返し追記していくので
このままだと、一回ごとに消えてしまうので
意味はありません。。

変数保持してそのあと。。とか考えてみたんですが
思いつきません

私のやり方が間違えっているのか?
このやり方での方法等
ご教授ください




引用返信 編集キー/
■85779 / inTopicNo.8)  Re[5]: csvデータへの追記
□投稿者/ WebSurfer (1360回)-(2017/11/23(Thu) 13:18:20)
No85778 (asa さん) に返信

Dictionary(Of String, List(Of String)) を使って、"A" 〜 "D" を key に、"10" とか "1" を
value に追加していくという方法はいかがですか?

具体例(あくまで例)は以下の通りです。C# で書いて変換サービスのサイトで VB.NET に変換し
たので VB.NET の書き方としては変なところがあるかも。でも、期待通りの結果になることは確
認済みです。

Option Strict On

Module Module1

    Sub Main()

        ' @ マスターデータをコピー
        Dim list As New Dictionary(Of String, List(Of String))()
        list.Add("A", New List(Of String)())
        list.Add("B", New List(Of String)())
        list.Add("C", New List(Of String)())
        list.Add("D", New List(Of String)())

        ' A, B 文字列を取得して追記(分かりやすくするため 2 行に分けた)
        Dim value As List(Of String) = list("B")
        value.Add("10")

        ' C これを何回も繰り返し
        list("A").Add("1")
        list("B").Add("20")
        list("B").Add("10")
        list("C").Add("15")

        ' D 結果を書き出し
        For Each kvp As KeyValuePair(Of String, List(Of String)) In list
            Dim record As String = kvp.Key + ","
            For Each s As String In kvp.Value
                record += s & Convert.ToString(",")
            Next
            record = record.TrimEnd(New Char() {","c})
            record += Environment.NewLine
            Console.Write(record)
        Next

        ' 結果は:
        ' A,1
        ' B,10,20,10
        ' C,15
        ' D

    End Sub

End Module

コメントの「結果は:」に書いたように foreach で取得して Add した順番にはなっていますが、
必ず Add した順番になるということは、少なくとも MSDN ライブラリの記述には見つけられませ
んでした。

なので、順序が重要ということであれば、SortedDictionary<TKey, TValue> を使うとか別の方法
を考えた方が良いかもしれません。

引用返信 編集キー/
■85780 / inTopicNo.9)  Re[6]: csvデータへの追記
□投稿者/ asa (4回)-(2017/11/23(Thu) 19:13:07)
No85779 (WebSurfer さん) に返信
> ■No85778 (asa さん) に返信
>
申し訳ございません
私の説明が足りなかったかもしれません

Valueが値なんですが
続けて追記というよりは







Key Bだとして

key.text log.textがあるとします

Key= B
log = 10 がデータ入力されて

ボタンクリックイベントにて押下すると

A
B,10
C

となり、次にクルのが

Key=B
log = 12

A
B,10,12
C

Key=A
log = 30

A,30
B,10,12
C


というCsvファイルをボタンクリックを押すと作成して
追記していくようなプログラムです

説明が足りないのか
皆さんの書いていただいているのを理解できていないか
私の理解力がないだけなのか
申し訳ございません

引用返信 編集キー/
■85781 / inTopicNo.10)  Re[7]: csvデータへの追記
□投稿者/ WebSurfer (1361回)-(2017/11/23(Thu) 19:29:12)
No85780 (asa さん) に返信

> Key Bだとして
>
> key.text log.textがあるとします
>
> Key= B
> log = 10 がデータ入力されて
>
> ボタンクリックイベントにて押下すると
>
> A
> B,10
> C

そこは、私が書いたコードで list(key.text).Add(log.text) とすれば良いはず。

> となり、次にクルのが

それも、key.text, log.text が「次にクル」ので書き換わっていれば同様です。

なので、

> 皆さんの書いていただいているのを理解できていないか
> 私の理解力がないだけなのか

その通りだと思います。

引用返信 編集キー/
■85782 / inTopicNo.11)  Re[5]: csvデータへの追記
□投稿者/ はるまきとかげ (1回)-(2017/11/23(Thu) 20:23:48)
No85778 (asa さん) に返信

処理は大きくわけて3つあります。

1.ファイルからデータを読み込む
2.データに値を追加する
3.ファイルにデータを書き込む

それぞれの処理は実行回数や実行のタイミングが異なりますので関数を分けましょう。
データは複数の関数からアクセスできるようにインスタンスフィールドに移動しましょう。


Private T_Datas As Dictionary(Of String, String)

Private Sub LoadData()
    T_Datas = New Dictionary(Of String, String)()

    For Each s As String In name_s'元データ読込変数
        T_Datas(s) = s
    Next
End Sub

private Sub log()
    T_Datas(val) = T_Datas(val) & "," & log.Text
End Sub

Private Sub SaveData()
    Dim today As String = Date.Now.ToString("yyyy年MM年dd日(ddd)_ログ")
    File.WriteAllLines("path" & today & ".csv", T_Datas.Values,enco)
End Sub


LoadData()はフォームが表示されたときのイベントや
読み込みボタンを用意してそれが押されたときのイベントで実行。

log()はボタンクリックイベントで実行。

SaveData()はフォームを閉じるときのイベントや
書き込みボタンを用意してそれが押されたときのイベントで実行。

という感じで。

引用返信 編集キー/
■85795 / inTopicNo.12)  Re[7]: csvデータへの追記
□投稿者/ WebSurfer (1363回)-(2017/11/25(Sat) 10:21:05)
No85780 (asa さん) に返信

ひょっとして、

> Valueが値なんですが
> 続けて追記というよりは
>
> 例
>
> A
> B
> C
>
> Key Bだとして
>
> key.text log.textがあるとします
>
> Key= B
> log = 10 がデータ入力されて
>
> ボタンクリックイベントにて押下すると
>
> A
> B,10
> C
>
> となり、

というところでいったん作業を止めて結果をファイルに書きこんでプログラムを終了し、

> 次にクルのが

のところでプログラムを再度立ち上げ、

> Key=B
> log = 12
>
> A
> B,10,12
> C

という作業を続行したいが、プログラムを立ち上げると初期状態(A, B, C しかない)に
戻ってしまうのが困ると言ってます?

もしそうであれば、

> 説明が足りないのか
> 皆さんの書いていただいているのを理解できていないか

前者なのですが、どうなんでしょう?
引用返信 編集キー/
■85816 / inTopicNo.13)  Re[6]: csvデータへの追記
□投稿者/ asa (5回)-(2017/11/27(Mon) 09:01:06)
No85782 (はるまきとかげ さん) に返信
> ■No85778 (asa さん) に返信
>

皆様のおかげでなんとか解決しました!
WebSurferさんのいう通り、説明も足りなかったです
申し訳ないです

教えて頂いた方たちには感謝します。
重大な事にきづきました

実は
メインフォームと別フォームで動いていたのですが

Private T_Datas As Dictionary(Of String, String)

Private Sub LoadData()
T_Datas = New Dictionary(Of String, String)()

For Each s As String In name_s'元データ読込変数
T_Datas(s) = s
Next
End Sub

private Sub log()
T_Datas(val) = T_Datas(val) & "," & log.Text
End Sub

Private Sub SaveData()
Dim today As String = Date.Now.ToString("yyyy年MM年dd日(ddd)_ログ")
File.WriteAllLines("path" & today & ".csv", T_Datas.Values,enco)
End Sub


Private T_Datas As Dictionary(Of String, String)

こいつ、別フォームで宣言してしまい
保持されないのは当たりまえでした・・

毎回Newしていたので新規新規なるため
1回しか書き込まれず
単純の私のミスです

皆さんからのご指摘と、ご指導のおかげで
気づき思惑通り、動きました

ありがとうございました!
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ