![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
いつもお世話になります。
複数の.datファイル(カンマ区切りの4~5列、約800行程度)
ProcessData,LOT_ID,3,AP0076686.00C,
ProcessData,LOT_ID_SUB,3,AP0076686.00,
ProcessData,LOT_NO,3,AP0076686,
ProcessData,WAFER_ID,3,AP0076686.19,
ProcessData,WAFER_NO,1,19,
ProcessData,PRODSPEC_ID,3,T5DH20001-00001.00,
ProcessData,PRODGRP_ID,3,T5DH2,
ProcessData,PRODGRP_BIND,3,T5DH2,
ProcessData,MAIN_MAINPD_ID,3,A6L511NY.00,
ProcessData,MAINPD_ID,3,A6L511NY.00,
ProcessData,FLOW_TYPE,3,Main,
ProcessData,FLOW_TYPE_NO,1,1,
ProcessData,D_SEQNO,1,169,
ProcessData,OP_NO,3,PNH PEP.MA1,
ProcessData,OP_NO_NAME,3,本処理,
ProcessData,PD_IDENT,3,PPNHIMA1.00,
ProcessData,PD_IDENT_NAME,3,PEP,
ProcessData,EQP_GROUP_CODE,3,PKRF,
ProcessData,EQP_GROUP_NAME,3,KrF SCANNER(SK3000 + ES5),
ProcessData,EQP_GROUP_BIND,3,PKRF,
ProcessData,EQP_ID,3,PKRF004,
ProcessData,PH_RECIPE_ID,3,PES5MIX,
ProcessData,RCP_NAME_SPACE,3,PEPMA,
ProcessData,LC_RECIPE_ID,3,PKRF.01,
ProcessData,RECIPE_ID,3,PEPMA.PES5MIX,
ProcessData,S_DATE,4,2019/01/24 12:47:09,
ProcessData,E_DATE,4,2019/01/24 12:47:51,
ProcessData,CAST_ID,3,PA0-00349,
ProcessData,SLOT_NO,1,19,
の中からSplitを用いて string[]dataTemp = fileData.Split(',');で
(ProcessData[0],EQP_ID[1],3[2],PKRF004[3],)のように配列に格納して
ifを使ってdataTemp[1] == "EQP_ID"の時にdataTemp[3](PKRF004)を
dataTemp[1] == "LOT_ID"の時にdataTemp[3] (AP0076686.00C)を
dataTemp[1] == "WAFER_ID"の時にdataTemp[3] (AP0076686.19)を
dataTemp[1] == "S_DATE"の時にdataTemp[3](2019/01/24 12:47:09)を
新たにCSVファイルを作成して上記のデータを入力したリストを作りたいのですが、C#初心者で
色々と試行錯誤しましたが知識が足りないようです。。。。
リストについてはヘッダーなどは必要ありません。.datが大量にあるので一列にEQP_ID、LOT_ID、WAFER_ID、S_DATEが並んだ状態で何100行とある状態リストを作成したいです。
詳しい方ご教授をお願いいたします。
No.6ベストアンサー
- 回答日時:
質問内容が多岐に渡ってきているため、どこまで出来て、どこが出来ないのか、を整理して、
改めて質問を行うことをお勧めします。
今できないのは、元の質問内容ではなく、それぞれのロジックの書き方を理解していませんよね。
C#の文法。
対象ディレクトリ内のファイルの一覧を得るにはどうすればいいのか。
ファイルの読み込み、書き出しをするにはどうすればいいのか。
繰り返し処理するにはどうすればいいのか。
など。
最終目的を質問しても、誰も正解は教えてくれませんし、ネットには正解は転がっていません。
知識、情報を組み合わせて正解を作り上げるので。
そのため、実現するためのプロセスを細分化し、プロセス単位に方法論をネットで調べるとか、質問するとかになると思います。
No.5
- 回答日時:
> 絶対パスについてStream Reader("C:\検証用\検証データ\MLOG_RCV")のようにしたらエ
> ラー
C#は、文字列内に\を入れるなら@を先頭に記述してください。
var path = @"C:\検証用\検証データ\MLOG_RCV";
GetFiles()によって配列で受け取っているので
foreach (var fi in files) {
Console.WriteLine(fi.FullName);
}
という書き方でいいです。
一度にやりたいことができないなら、1つ1つ順番に学ぶしかありませんね。
No.4
- 回答日時:
私が提示したものは、以下のことしかしていません。
1.1ファイルの読み込み、解析、必要情報の保持。
2.ファイルの書き出し。
ファイルの読み込みが複数ファイルあるならば、1.部分をファイル数分実施すればいいことになります。
FileInfoにはFullNameプロパティがあり、ファイルの絶対パスを得ることができます。
https://docs.microsoft.com/ja-jp/dotnet/api/syst …
書き出すファイル名は求める仕様に合わせて自由に設定してください。
実装が分からないというよりかは、どうすると実現できるのかがぼんやりしているのではないでしょうか。
No.3
- 回答日時:
System.IO.Path, System.IO.File, System.IO.Directoryあたりを眺めてみてはいかがですか。
https://dobon.net/vb/dotnet/file/getfiles.html
ファイル名も絶対パス指定すればその通りになります。
No.1
- 回答日時:
[Nugetパッケージの管理]から CsvHelper をインストール。
複数ファイルを読み込んで書き出し用リストに突っ込めば出来ると思います。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace ConsoleApp1
{
class DatRowValues
{
public string ProcessData { get; set; }
public string KeyValue { get; set; }
public int IntValue { get; set; }
public string StringValue { get; set; }
}
class NewDatRowValues
{
public string EqpId { get; set; }
public string LotId { get; set; }
public string WaferId { get; set; }
public DateTime SDate { get; set; }
}
class NewDatRowValuesMapper : CsvHelper.Configuration.ClassMap<NewDatRowValues>
{
public NewDatRowValuesMapper()
{
Map(x => x.EqpId).Index(0);
Map(x => x.LotId).Index(1);
Map(x => x.WaferId).Index(2);
Map(x => x.SDate).Index(3).TypeConverterOption.Format("yyyy/MM/dd HH:mm:ss");
}
}
class Program
{
static void Main(string[] args)
{
// 書き出し用の入れ物を用意
var writeDatList = new List<NewDatRowValues>();
// 読み込み
using (var sr = new StreamReader("test.dat"))
using (var inputDat = new CsvHelper.CsvReader(sr))
{
inputDat.Configuration.HasHeaderRecord = false;
// 必要なキーとなる行のみ抽出
var dat = inputDat.GetRecords<DatRowValues>();
var targetRows = dat.Where(r =>
r.KeyValue == "EQP_ID" ||
r.KeyValue == "LOT_ID" ||
r.KeyValue == "WAFER_ID" ||
r.KeyValue == "S_DATE");
// それぞれの値を格納
var newRow = new NewDatRowValues();
foreach (var row in targetRows)
{
if (row.KeyValue == "EQP_ID")
{
newRow.EqpId = row.StringValue;
}
if (row.KeyValue == "LOT_ID")
{
newRow.LotId = row.StringValue;
}
if (row.KeyValue == "WAFER_ID")
{
newRow.WaferId = row.StringValue;
}
if (row.KeyValue == "S_DATE")
{
newRow.SDate = DateTime.Parse(row.StringValue);
}
}
writeDatList.Add(newRow);
}
// 書き出し
using (var sw = new StreamWriter("newdat.dat"))
using (var outputDat = new CsvHelper.CsvWriter(sw))
{
outputDat.Configuration.HasHeaderRecord = false;
outputDat.Configuration.RegisterClassMap<NewDatRowValuesMapper>();
outputDat.WriteRecords(writeDatList);
}
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- JavaScript gasについて 1 2022/05/31 21:51
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- MySQL MYSQL エラー 2 2022/10/18 11:37
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
サイトマップにサブドメインを...
-
【Excel VBA】取り込んだファイ...
-
HTMLテキストリンクでExcelファ...
-
HTMLまたはJavaScriptでフ...
-
VB2008 iniファイルの全セクシ...
-
openglで音楽を再生する
-
\\記号が入った数値の処理につ...
-
VB6.0のメモリリークについて
-
バイナリデータで表示or再生す...
-
リソースファイルを認識してく...
-
VBScriptから指定URLを次々に開...
-
VBAで、JPG写真の撮影日時を読...
-
Eclipseで検索ができなくなった
-
C++によるファイル送受信プログ...
-
MusicXMLファイル作り方教えて...
-
ディレクトリのサイズの取得
-
0バイトのテキストファイル
-
ファイル名を任意の名前に作成...
-
HTMLでソースを共通化する
-
MFC SDIアプリで開いているファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
0バイトのテキストファイル
-
VBAで、JPG写真の撮影日時を読...
-
HTMLテキストリンクでExcelファ...
-
Eclipseで検索ができなくなった
-
VB6.0のメモリリークについて
-
main関数のコマンドライン引数...
-
2GB以上のファイルを扱う方法
-
サイトマップにサブドメインを...
-
ファイル更新日取得
-
ファイル作成日時と更新日時を...
-
エディットボックスの内容をテ...
-
【VBA】印刷マクロのループ処理...
-
<input type="file" で初期値...
-
【VBA】複数CSVの特定範囲を1つ...
-
VB2008 iniファイルの全セクシ...
-
C++によるファイル送受信プログ...
-
GetOpenFileName()について
-
IMEのモードを強制的に変えるには
-
ファイル内容を比較する方法
おすすめ情報
詳しい説明ありがとうございます。
初心者なものでいくつか質問致します。
// 読み込み
using (var sr = new StreamReader("test.dat"))
using (var inputDat = new CsvHelper.CsvReader(sr))
の部分ではファイルの場所がSystem.IO.FileNotFoundException: 'ファイル 'C:\Users\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug\test.dat'なのですが任意のフォルダを指定する場合はどのようにしたらよいでしょうか?またフォルダ内に複数のdatファイルがある為 *.datで全てを読み込みたいのですがどのようにしたらよいでしょうか?
何度も申し訳ございません。
// 書き出し
using (var sw = new StreamWriter("newdat.dat"))
using (var outputDat = new CsvHelper.CsvWriter(sw))の部分ですが、最終的にCSVファイルでリストを残したいのですがnewdat.datをlist.csvなどに書き換えればよいのでしょうか?
またこのnewdat.datの保存場所が分からないです。。。(;^_^A
任意の場所に指定できるのであれば教えていただきたいです。
//"C:\test"以下の".txt"ファイルをすべて取得する
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\検証用\検証データ\MLOG_RCV\");System.IO.FileInfo[] files =di.GetFiles("*.dat", System.IO.SearchOption.AllDirectories);
のように指定するとよいと思うのですが、回答1で教えていただいたコードのどの部分に追加すればよいのかがまだ分かっておりません。。。何度も申し訳ないですが宜しくお願い致します。
読み込むdatファイルはC:\検証用\検証データ\MLOG_RCVにあり
書き込むcsvファイルをC:\検証用\検証データ\MLOG_RCV\BACKUP\でList.csvにしたいです。
何度も詳しい解説ありがとうございます。
C#を最近勉強し始めたばかりで知らない言葉が沢山ありやっていることは単純でも混乱していました。絶対パスについてStream Reader("C:\検証用\検証データ\MLOG_RCV")のようにしたらエラーで「認識できないエスケープシーケンスです。」と出てしまい、書き方が間違えているのですが、なかなか思った通りに実装することができません。イメージとしては1部分をフォルダ内に*.datがある限り繰り返すwhileなどを使ったりするとよいのかと思うのですが、変にソースコードをいじってしまいエラーが・・・・
数日かけての回答ありがとうございます。独学だと正しい書き方なども分からずサンプルも上手く使えないみたいです。 class DatRowValuesやclass NewDatRowValues、 class NewDatRowValuesMapper : CsvHelper.Configuration.ClassMap<NewDatRowValues>の中身については変更はしなくてよいという認識で間違いないでしょうか?{get ; set}を使ったことがなくてサンプルでもまだ完全には理解できてないみたいです。class Program内ですがvar path = @"C:\検証用\検証データ\MLOG_RCV";とforeach (var fi in files) {Console.WriteLine(fi.FullName);
}を追加したのですが、エラーや警告が消えないみたいです。
基礎的な部分ができていないので・・・using (var sr = new StreamReader(@"C:\検証用\検証データ\MLOG_RCV"));部分のemptyステートメントが間違っている可能性がありますという警告と
var path = @"C:\検証用\検証データ\MLOG_RCV";
foreach(var fi in files)
{
Console.WriteLine(fi.FullName);
}
の変数'path'は割り当てられていますが、その値は使用されていません。と
現在のコンテキストに'㏛'という名前は存在しません。
現在のコンテキストに'files'という名前は存在しません。
現在のコンテキストに'sw'という名前は存在しません。のエラーが出ています。
失礼しました。emptyステートメントについては セミコロンを間違えて入れていたので消したことで警告が消え、
エラーと警告は変数'path'は割り当てられていますが、その値は使用されていません。と
現在のコンテキストに'files'という名前は存在しません。のみになりました。