2

私はERP統合ソフトウェアで働いています。エントリを作成するには、HRM アプリケーションから CSV ファイルを解析する必要があります。
次のような入力 CSV ファイルを取得しています。

$Emp.No$=123456,$CardNo$=254658,$InTime$="12/11/2013 09:03:05",$OutTime$="12/11/2013 17:25:20"
$Emp. No$=565556,$CardNo$=254689,$InTime$="2013/12/11 09:03:50",$OutTime$="2013/12/11 18:01:11"

CSV ファイルには列名ヘッダーがありません。代わりに、各フィールドには 内に関連付けられたフィールド名があります$FieldName$

CSVHelperで解析しようとしました。ReadFieldsByIndex()メソッドを使用すると、うまく機能します。

問題:一部の列にまたは
がありません。したがって、インデックスによる読み取りは失敗します。利用可能なデータのみを読み取る方法と、各行で利用可能なフィールド名に従ってマッピングする方法。 $InTime$$OutTime$

4

2 に答える 2

2

そこに CSV ファイルがありません。データ ファイルがあり、その各行には、コンマで区切られた 1 つ以上のキーと値のペアが含まれています。キーと値は で区切られ=、キーは で囲まれ$ます。

あなたが持っているものを表現したので、それは解決策を特定するのに役立ちます:

  1. CSV フレームワークを使用しないでください。
  2. ファイルから一度に各行を読み取ります。
  3. 行を分割して,、キーと値のペアを提供します。
  4. キーと値のペアを分割し=て 2 つの部分にします。
  5. (オプション)$キー名から を削除します。

次に、これらの値を任意の宛先オブジェクトに転送するための適切なレベルのデータが必要です。

于 2013-11-20T11:36:04.987 に答える
0

これにより、ヘッダーとそれに続く値を含む別のファイルに書き込まれます。

        string file =@"D:\STACKOVERFLOW\csvproblem.txt";            
        string newfile =@"D:\STACKOVERFLOW\output.txt";

        StreamReader sr = new StreamReader(file);
        StreamWriter sw = new StreamWriter(newfile);


        try{
            string header = "";
            StringBuilder sb = new StringBuilder();
            StringBuilder sb_header = new StringBuilder();
            bool recordHeader = true;

            while(sr.EndOfStream==false){
                string readLine = sr.ReadLine();
                string[] split = readLine.Split(',');
                sb = new StringBuilder();

                foreach (string str in split)
                {
                    if (recordHeader)
                    {
                        if (str.IndexOf('$') < str.LastIndexOf('$'))
                        {
                           sb_header.AppendFormat("{0},",
                               str.Substring(str.IndexOf('$'),str.IndexOf('$')+str.LastIndexOf('$')+1));
                        }
                    }

                    sb.AppendFormat("{0},", str.Substring(str.IndexOf('=')+1));
                }

                if (recordHeader)
                {
                    sw.WriteLine(sb_header.ToString().Trim(','));
                }
                sw.WriteLine(sb.ToString().Trim(','));

                recordHeader = false;
            }
        }
        finally{
            sr.Close();
            sw.Close();
        }
于 2013-11-20T13:20:08.247 に答える