2012-02-03 16 views
0

私は.csvファイルを持っています(私はデータを制御できません)。何らかの理由で引用符で囲まれています。ファイルヘルパーの引用符を削除する

"Date","Description","Original Description","Amount","Type","Category","Name","Labels","Notes" 
"2/02/2012","ac","ac","515.00","a","b","","javascript://" 
"2/02/2012","test","test","40.00","a","d","c",""," " 

私はfilehelpersを使用していると私はすべてのこれらの引用符を削除するための最良の方法がどうなるか疑問に思って? 「引用符が削除されたら引用符が見つからない場合は何もしない」ということがありますか?

これは私が、私はそれが小数ではない文字列であることを、この場合にはしたい、特に以来(不要な余分な引用符で"\"515.00\""を持つことになりますように、データを台無しにするJavaScript 『」。

私もわからものではありませんよ』すべてに約ある、なぜそれが生成されましたが、これは私が何もコントロールの上に持っていないサービスからである。

編集 これは私はcsvファイルを消費する方法である。

using (TextReader textReader = new StreamReader(stream)) 
     { 
      engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue; 

      object[] transactions = engine.ReadStream(textReader); 
     } 
+0

は、我々はコードを見ることができますか? –

答えて

6

あなたは、属性のページhereに最高の説明FieldQuoted属性を使用することができます。属性は任意のFileHelpersフィールドに適用できます(たとえタイプがDecimalであっても)。 (FileHelpersクラスはインポートファイルの仕様を記述していることに注意してください。DecimalフィールドにFieldQuotedとマークすると、ファイルにと表示されます。このフィールドは引用されます。あなたも引用符がここ

[FieldQuoted('"', QuoteMode.OptionalForBoth)] 

でオプションであるかどうかを指定することができ

は、あなたのデータで動作するコンソールアプリケーションです:

class Program 
{ 
    [DelimitedRecord(",")] 
    [IgnoreFirst(1)] 
    public class Format1 
    { 
     [FieldQuoted] 
     [FieldConverter(ConverterKind.Date, "d/M/yyyy")] 
     public DateTime Date; 
     [FieldQuoted] 
     public string Description; 
     [FieldQuoted] 
     public string OriginalDescription; 
     [FieldQuoted] 
     public Decimal Amount; 
     [FieldQuoted] 
     public string Type; 
     [FieldQuoted] 
     public string Category; 
     [FieldQuoted] 
     public string Name; 
     [FieldQuoted] 
     public string Labels; 
     [FieldQuoted] 
     [FieldOptional] 
     public string Notes; 
    } 

    static void Main(string[] args) 
    { 
     var engine = new FileHelperEngine(typeof(Format1)); 

     // read in the data 
     object[] importedObjects = engine.ReadString(@"""Date"",""Description"",""Original Description"",""Amount"",""Type"",""Category"",""Name"",""Labels"",""Notes"" 
""2/02/2012"",""ac"",""ac"",""515.00"",""a"",""b"","""",""javascript://"" 
""2/02/2012"",""test"",""test"",""40.00"",""a"",""d"",""c"","""","" """); 

     // check that 2 records were imported 
     Assert.AreEqual(2, importedObjects.Length); 

     // check the values for the first record 
     Format1 customer1 = (Format1)importedObjects[0]; 
     Assert.AreEqual(DateTime.Parse("2/02/2012"), customer1.Date); 
     Assert.AreEqual("ac", customer1.Description); 
     Assert.AreEqual("ac", customer1.OriginalDescription); 
     Assert.AreEqual(515.00, customer1.Amount); 
     Assert.AreEqual("a", customer1.Type); 
     Assert.AreEqual("b", customer1.Category); 
     Assert.AreEqual("", customer1.Name); 
     Assert.AreEqual("javascript://", customer1.Labels); 
     Assert.AreEqual("", customer1.Notes); 

     // check the values for the second record 
     Format1 customer2 = (Format1)importedObjects[1]; 
     Assert.AreEqual(DateTime.Parse("2/02/2012"), customer2.Date); 
     Assert.AreEqual("test", customer2.Description); 
     Assert.AreEqual("test", customer2.OriginalDescription); 
     Assert.AreEqual(40.00, customer2.Amount); 
     Assert.AreEqual("a", customer2.Type); 
     Assert.AreEqual("d", customer2.Category); 
     Assert.AreEqual("c", customer2.Name); 
     Assert.AreEqual("", customer2.Labels); 
     Assert.AreEqual(" ", customer2.Notes); 
    } 
} 

(注、あなたの最初の行データには9の代わりに8つのフィールドがあるように見えるので、フィールドにFieldOptionalとマークしました。

0
string[] lines = new string[] 
{ 
    "\"Date\",\"Description\",\"Original Description\",\"Amount\",\"Type\",\"Category\",\"Name\",\"Labels\",\"Notes\"", 
    "\"2/02/2012\",\"ac\",\"ac\",\"515.00\",\"a\",\"b\",\"\",\"javascript://\"", 
    "\"2/02/2012\",\"test\",\"test\",\"40.00\",\"a\",\"d\",\"c\",\"\",\" \"", 
}; 

string[][] values = 
    lines.Select(line => 
     line.Trim('"') 
      .Split(new string[] { "\",\"" }, StringSplitOptions.None) 
      .ToArray() 
     ).ToArray(); 

lines配列はあなたのサンプル内の行を表し:は、ここにそれを行うための一つの方法です。各"文字は、C#の文字列リテラルで\"としてエスケープする必要があります。

各行について、最初と最後の"文字を削除してから、","文字シーケンスを区切り文字として使用して部分文字列のコレクションに分割します。あなたは(エスケープしても)自分の価値観の中に天然に存在する"文字を持っている場合、上記のコードはを動作しないこと

注意。

編集:あなたのCSVストリームから読み取ることがある場合は、実行するすべてのあなたの必要性がある:

var lines = new List<string>(); 
using (var streamReader = new StreamReader(stream)) 
    while (!streamReader.EndOfStream) 
     lines.Add(streamReader.ReadLine()); 

上記のコードの残りの部分はそのまま動作します。

編集:あなたの新しいコードを考えると、あなたはこのような何かを探しているかどうかを確認します。私は同じ苦境を持っていると私は私のリストオブジェクトに値をロードするとき、私は引用符を置き換える

for (int i = 0; i < transactions.Length; ++i) 
{ 
    object oTrans = transactions[i]; 
    string sTrans = oTrans as string; 
    if (sTrans != null && 
     sTrans.StartsWith("\"") && 
     sTrans.EndsWith("\"")) 
    { 
     transactions[i] = sTrans.Substring(1, sTrans.Length - 2); 
    } 
} 
+0

私が与えたコードは、ストリームからアップロードされ読み込まれる.csvファイルの例です。 – chobo2

+0

さて、彼らはオブジェクトの配列を返すいくつかのビルドメソッド "engine"を手に入れました。変更を参照してください。 – chobo2

0

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Windows.Forms; 

namespace WindowsFormsApplication6 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      LoadCSV(); 
     } 

     private void LoadCSV() 
     { 
      List<string> Rows = new List<string>(); 
      string m_CSVFilePath = "<Path to CSV File>"; 

      using (StreamReader r = new StreamReader(m_CSVFilePath)) 
      { 
       string row; 

       while ((row = r.ReadLine()) != null) 
       { 
        Rows.Add(row.Replace("\"", "")); 
       } 

       foreach (var Row in Rows) 
       { 
        if (Row.Length > 0) 
        { 
         string[] RowValue = Row.Split(','); 

         //Do something with values here 
        } 
       } 
      } 
     } 

    } 
} 
+0

私はオプションを探していて、このフィールド属性がそのトリックを行うかもしれないようです。 FieldQuoted(QuoteMode.OptionalForBoth)。私は彼らが1つのオプションを欠いていると思う(読んだり書いても引用符を無視するもの) – chobo2

+0

@ chobo2 - それでもFilehelpersを使うならクライアントマシンにDLLをインストールする必要がありますか?私のソリューションは、フレームワークを使用して、追加のファイルを必要としません。 –

0

私が開発を助けるかもしれないこのコード:

using (StreamReader r = new StreamReader("C:\\Projects\\Mactive\\Audience\\DrawBalancing\\CSVFiles\\Analytix_ABC_HD.csv")) 
{ 
    string row; 

    int outCount; 
     StringBuilder line=new StringBuilder() ; 
     string token=""; 
     char chr; 
     string Eachline; 

    while ((row = r.ReadLine()) != null) 
    { 
     outCount = row.Length; 
     line = new StringBuilder(); 
     for (int innerCount = 0; innerCount <= outCount - 1; innerCount++) 
     {     
      chr=row[innerCount]; 

      if (chr != '"') 
      { 
       line.Append(row[innerCount].ToString()); 
      } 
      else if(chr=='"') 
      { 
       token = ""; 
       innerCount = innerCount + 1; 
       for (; innerCount < outCount - 1; innerCount++) 
       { 
        chr=row[innerCount]; 
        if(chr=='"') 
        { 
         break; 
        } 

        token = token + chr.ToString();        
       } 

       if(token.Contains(",")){token=token.Replace(",","");} 
       line.Append(token); 
      }     
     } 
     Eachline = line.ToString(); 
     Console.WriteLine(Eachline); 
    } 
} 
関連する問題