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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

6777閲覧

C# CSVに1行ごとに書き込みを行う

tanaka_sa

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/01/11 04:40

編集2022/01/11 05:36

前提・実現したいこと

前提
C#を使用し、PCで吸い上げた複数の数値データを1秒にCSVに保存するシステムを作成しています。

実現したいこと
各数値データを.AddにてListに加えていき、File.AppendAllLinesでCSVに書き込みを行う。
その際、毎秒一列毎にCSVに書き込み(追加)を行う。

原因、質問

原因
CSVに書き込みを行うと、各数値データが行に追加されています。
原因は、Listの中が{"1","2","3","4"}と、それぞれの数字をダブルクォートで囲って、カンマで区切っているからだと思っております。

質問
.Addでリストに追加後、カンマを含みダブルクォートで変換する方法はないでしょうか。
{"1","2","3","4"}→{"1,2,3,4"}
上記のようにすれば、1秒毎に1行ずつCSVにデータが追加されていくものと考えています。

参考該当のソースコード

List<string> list = new List<string>(); list.Add("1 , 2"); list.Add("3"); list.Add("4"); list.Add("5"); File.AppendAllLines(@"C:\C#\mydatatest.csv", list);

CSV出力
A  B
1 1 2
2 3
3 4
4 5

###対策後行いたいこと

機器の電流、電圧などのデータをCSVファイルに保存し、後日確認出来るようにしたいと考えております。
CSVファイルに記載する内容は、記録時間、及びその時のデータを一定時間ごとに追加したいと考えております。
現状
イメージ説明

目標
イメージ説明

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

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

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

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

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

y_waiwai

2022/01/11 04:43

問題は何でしょうか
退会済みユーザー

退会済みユーザー

2022/01/11 04:57

> 原因は、Listの中が{"1","2","3","4"}と、それぞれの数字をダブルクォートで囲って、カンマで区切っているからだと思っております。 上記は意味不明ですが、コードを見ると "1 , 2", "3", "4", "5" の 4 つの文字列を 4 行に分けて書き込んでいるということで当たり前の結果に見えますけど? 何をして、どういう結果になればいいのかわかりません。
tanaka_sa

2022/01/11 05:01

y_waiwai様 CSVにデータを書き込む際に、1行数列で書き込みを行いたいと考えております。 現状ですと、数行1列で書き込みが行われます。 上記の例ですと、CSVに   A B C D E 1 1 2 3 4 5 と記載したいと考えております。
y_waiwai

2022/01/11 05:09

現状はどうなっていて、それをどうしたいのか、詳しく説明しましょう。 質問文を編集してそこに追記してください いまではなにをどうしたいのかさっぱりわかりません
tanaka_sa

2022/01/11 05:45

SurferOnWww様 y_waiwai様 質問内容を編集しました。
退会済みユーザー

退会済みユーザー

2022/01/11 05:59

目標の画像のような CSV ファイルを作るにはどういうコードを書けば良いかが分かればいいのですか?
tanaka_sa

2022/01/11 06:11

SurferOnWww様 どのようなコードを書けばよいか教えていただきたいですが、4つの文字列を1行に書き込む方法を教えていただきたく存じます。
退会済みユーザー

退会済みユーザー

2022/01/11 06:16

> 4つの文字列を1行に書き込む方法を教えていただきたく存じます。 1 行に書いたら「目標」のようにはなりませんけど? 「目標」のようにするには 4 行に分けないとダメです。
tanaka_sa

2022/01/11 06:55

SurferOnWww様 ご回答いただきありがとうございます。 私の質問の仕方に問題があり大変恐縮ですが、ループ処理を行い、一秒ごとに「データをListに追加→CSVファイルに書き込み」という処理を行いたいと考えております。 1行に書き込むデータの内容は、「時間」「電圧値」「電流値」で考えており、そのデータを毎秒CSVに追加書き込みを行っていくことを考えております。 複数の値をListに1行で書き込むことは出来るのでしょうか。
退会済みユーザー

退会済みユーザー

2022/01/11 07:05

回答したのでそちらを見てください。それに答えがあるはずです。分からないということなら質問の下のコメント欄で聞いてください。
guest

回答2

0

ベストアンサー

原因は、Listの中が{"1","2","3","4"}と、それぞれの数字をダブルクォートで囲って、カンマで区切っているからだと思っております。

まずこの認識が間違っています。

C#

1List<string> list = new List<string>(); 2list.Add("1"); 3list.Add("2"); 4list.Add("3"); 5list.Add("4");

上記のコードを実行したとき、listには「1」という文字列、「2」という文字列、「3」という文字列、「4」という文字列が格納されているだけで、それはダブルクォートで囲まれていませんしカンマで区切られてもいません。

.Addでリストに追加後、カンマを含みダブルクォートで変換する方法はないでしょうか。
{"1","2","3","4"}→{"1,2,3,4"}

その誤解を訂正した上で質問を解釈すると、
「1」と「2」と「3」と「4」の文字列が格納されているlistをもとに、「1,2,3,4」の文字列が格納されたlistを作りたい
というのが質問者さんの望むことだと思います。

理解しやすいよう愚直に書くと、以下のような感じですね。

C#

1List<string> list = new List<string>(); 2list.Add("1"); 3list.Add("2"); 4list.Add("3"); 5list.Add("4"); 6 7// 「1,2,3,4」の文字列を作る 8string joinStr = ""; 9foreach (string item in list) 10{ 11 if (joinStr != "") { joinStr += ","; } 12 joinStr += item; 13} 14 15// 上で作った文字列のみが入ったリストを作る 16List<string> joinList = new List<string>(); 17joinList.Add(joinStr); 18 19// list変数を上書き 20list = joinList;

投稿2022/01/11 07:42

ku__ra__ge

総合スコア4524

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

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

ku__ra__ge

2022/01/11 07:46

ちなみに list = new List<string>() { string.Join(",", list) }; と書けば1行です。
tanaka_sa

2022/01/11 08:27

ku__ra__ge様 ご回答ありがとうございます。 ご回答いただきたないようで、私の行いたいことを実現できました。 ご回答いただいた内容も、私が説明したくとも言語化できていなかった内容でした。 私の言葉足らずの箇所を補ってご回答いただき、誠にありがとうございます。 また、私の質問内容の間違いも指摘いただきありがとうございます。 大変勉強になりました。
guest

0

質問に追加した「目標」の画像の CSV ファイルを作るにはどういうコードを書けば良いかが分かれば良いと理解してレスします。

以下のコードで CSV ファイルが生成され(第 3 引数に Encoding.GetEncoding("shift_jis") を指定しないと UTF-8 で作るようで、Excel で開いた時に文字化けします)、

using System.Collections.Generic; using System.Text; using System.IO; namespace ConsoleApp1 { internal class Program { static void Main(string[] args) { List<string> list = new List<string>(); list.Add("時間,電圧,電流"); list.Add("12:00,0,0"); list.Add("12:01,200,10"); list.Add("12:02,202,0"); File.AppendAllLines(@"C:\Users\surfe\Documents\mydatatest.csv", list, Encoding.GetEncoding("shift_jis")); } } }

メモ帳で開くと以下の通り、

イメージ説明

Excel で開くと以下の通り、画像の「目標」の通り csv ファイルが生成されています。

イメージ説明

投稿2022/01/11 06:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tanaka_sa

2022/01/11 07:18

ご回答いただきありがとうございます。 CSVに出力する方法を理解することが出来ました。 申し訳ありませんが、ご回答いただきました内容で、Add中のコンマ間の値を変数とすることは可能でしょうか。 変数とすることで、ループ処理を行い、1秒毎値の変化をCSVに書き込むことが可能ではないかと考えています。
退会済みユーザー

退会済みユーザー

2022/01/11 07:40

> Add中のコンマ間の値を変数とすることは可能でしょうか。 その変数とやらが例えば time, volt, amp だったとして、time + "," + volt + "," + amp とした結果が期待する文字列になるならできると思います。
tanaka_sa

2022/01/11 08:25

SurferOnWww様 ご回答いただきありがとうございます。 ご回答いただきました内容で試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問