電子書籍の厳選無料作品が豊富!

いつもお世話になります。
複数の.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行とある状態リストを作成したいです。

詳しい方ご教授をお願いいたします。

質問者からの補足コメント

  • うーん・・・

    詳しい説明ありがとうございます。
    初心者なものでいくつか質問致します。
    // 読み込み
    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で全てを読み込みたいのですがどのようにしたらよいでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/04/02 10:32
  • うーん・・・

    何度も申し訳ございません。
    // 書き出し
    using (var sw = new StreamWriter("newdat.dat"))
    using (var outputDat = new CsvHelper.CsvWriter(sw))の部分ですが、最終的にCSVファイルでリストを残したいのですがnewdat.datをlist.csvなどに書き換えればよいのでしょうか?
    またこのnewdat.datの保存場所が分からないです。。。(;^_^A
    任意の場所に指定できるのであれば教えていただきたいです。

      補足日時:2019/04/02 10:36
  • うーん・・・

    //"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にしたいです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2019/04/02 15:09
  • つらい・・・

    何度も詳しい解説ありがとうございます。
    C#を最近勉強し始めたばかりで知らない言葉が沢山ありやっていることは単純でも混乱していました。絶対パスについてStream Reader("C:\検証用\検証データ\MLOG_RCV")のようにしたらエラーで「認識できないエスケープシーケンスです。」と出てしまい、書き方が間違えているのですが、なかなか思った通りに実装することができません。イメージとしては1部分をフォルダ内に*.datがある限り繰り返すwhileなどを使ったりするとよいのかと思うのですが、変にソースコードをいじってしまいエラーが・・・・

    No.4の回答に寄せられた補足コメントです。 補足日時:2019/04/02 18:09
  • うーん・・・

    数日かけての回答ありがとうございます。独学だと正しい書き方なども分からずサンプルも上手く使えないみたいです。 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);
    }を追加したのですが、エラーや警告が消えないみたいです。

    No.5の回答に寄せられた補足コメントです。 補足日時:2019/04/03 09:30
  • うーん・・・

    基礎的な部分ができていないので・・・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'という名前は存在しません。のエラーが出ています。

      補足日時:2019/04/03 09:58
  • うーん・・・

    失礼しました。emptyステートメントについては セミコロンを間違えて入れていたので消したことで警告が消え、
    エラーと警告は変数'path'は割り当てられていますが、その値は使用されていません。と
    現在のコンテキストに'files'という名前は存在しません。のみになりました。

      補足日時:2019/04/03 10:02

A 回答 (6件)

質問内容が多岐に渡ってきているため、どこまで出来て、どこが出来ないのか、を整理して、


改めて質問を行うことをお勧めします。

今できないのは、元の質問内容ではなく、それぞれのロジックの書き方を理解していませんよね。
C#の文法。
対象ディレクトリ内のファイルの一覧を得るにはどうすればいいのか。
ファイルの読み込み、書き出しをするにはどうすればいいのか。
繰り返し処理するにはどうすればいいのか。
など。

最終目的を質問しても、誰も正解は教えてくれませんし、ネットには正解は転がっていません。
知識、情報を組み合わせて正解を作り上げるので。

そのため、実現するためのプロセスを細分化し、プロセス単位に方法論をネットで調べるとか、質問するとかになると思います。
    • good
    • 1

> 絶対パスについてStream Reader("C:\検証用\検証データ\MLOG_RCV")のようにしたらエ


> ラー
C#は、文字列内に\を入れるなら@を先頭に記述してください。
var path = @"C:\検証用\検証データ\MLOG_RCV";

GetFiles()によって配列で受け取っているので
foreach (var fi in files) {
Console.WriteLine(fi.FullName);
}
という書き方でいいです。

一度にやりたいことができないなら、1つ1つ順番に学ぶしかありませんね。
この回答への補足あり
    • good
    • 1

私が提示したものは、以下のことしかしていません。


 1.1ファイルの読み込み、解析、必要情報の保持。
 2.ファイルの書き出し。

ファイルの読み込みが複数ファイルあるならば、1.部分をファイル数分実施すればいいことになります。

FileInfoにはFullNameプロパティがあり、ファイルの絶対パスを得ることができます。
https://docs.microsoft.com/ja-jp/dotnet/api/syst …

書き出すファイル名は求める仕様に合わせて自由に設定してください。

実装が分からないというよりかは、どうすると実現できるのかがぼんやりしているのではないでしょうか。
この回答への補足あり
    • good
    • 1

System.IO.Path, System.IO.File, System.IO.Directoryあたりを眺めてみてはいかがですか。



https://dobon.net/vb/dotnet/file/getfiles.html

ファイル名も絶対パス指定すればその通りになります。
この回答への補足あり
    • good
    • 1

TextFieldParser で読む。


例はなんぼでも転がっているので略。
    • good
    • 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);
}
}
}
}
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!