2016-07-19 6 views
1

私はcsvファイルをインポートし、各行を読み込んでSitecoreの対応する項目を更新するスクリプトを持っています。これは多くの製品で機能しますが、行内の特定のセルにコンマが付いている製品(製品の説明など)の問題があります。いくつかのセルにカンマが含まれているcsvファイルから値を取得するにはどうすればよいですか?

protected void SubmitButton_Click(object sender, EventArgs e) 
{ 
    if (UpdateFile.PostedFile != null) 
    { 
     var file = UpdateFile.PostedFile; 

     // check if valid csv file 

     message.InnerText = "Updating..."; 

     Sitecore.Context.SetActiveSite("backedbybayer"); 
     _database = Database.GetDatabase("master"); 
     SitecoreContext context = new SitecoreContext(_database); 
     Item homeNode = context.GetHomeItem<Item>(); 


     var productsItems = 
      homeNode.Axes.GetDescendants() 
       .Where(
        child => 
         child.TemplateID == new ID(TemplateFactory.FindTemplateId<IProductDetailPageItem>())); 

     try 
     { 
      using (StreamReader sr = new StreamReader(file.InputStream)) 
      { 
       var firstLine = true; 
       string currentLine; 
       var productIdIndex = 0; 
       var industryIdIndex = 0; 
       var categoryIdIndex = 0; 
       var pestIdIndex = 0; 
       var titleIndex = 0; 
       string title; 
       string productId; 
       string categoryIds; 
       string industryIds; 
       while ((currentLine = sr.ReadLine()) != null) 
       { 
        var data = currentLine.Split(',').ToList(); 
        if (firstLine) 
        { 
         // find index of the important columns 
         productIdIndex = data.IndexOf("ProductId"); 
         industryIdIndex = data.IndexOf("PrimaryIndustryId"); 
         categoryIdIndex = data.IndexOf("PrimaryCategoryId"); 
         titleIndex = data.IndexOf("Title"); 
         firstLine = false; 
         continue; 
        } 

        title = data[titleIndex]; 
        productId = data[productIdIndex]; 
        categoryIds = data[categoryIdIndex]; 
        industryIds = data[industryIdIndex]; 

        var products = productsItems.Where(x => x.DisplayName == title); 
        foreach (var product in products) 
        { 
         product.Editing.BeginEdit(); 
         try 
         { 
          product.Fields["Product Id"].Value = productId; 
          product.Fields["Product Industry Ids"].Value = industryIds; 
          product.Fields["Category Ids"].Value = categoryIds; 
         } 
         finally 
         { 
          product.Editing.EndEdit(); 
         } 
        } 
       } 
      } 

      // when done 
      message.InnerText = "Complete"; 
     } 
     catch (Exception ex) 
     { 
      message.InnerText = "Error reading file"; 
     }    
    } 
} 

問題は、それが同様に分割し、インデックスをオフにスローされますので、categoryIds = data[8]が間違った値を取得します「製品は、効果的な、予防biofungicideである」のような記述欄には、コンマを持っているときということです。

スプレッドシートは私たちのクライアントから提供されたデータなので、必要がない限り、クライアントがファイルを編集する必要はありません。私のコードでこれを処理できる方法はありますか?すべてをコンマで区切らないファイルを読むことができる別の方法はありますか?フィールドのデータは、内部の引用符があり、それはフィールドのようにそれを解析し、この内の任意のカンマを無視した場合

+1

あなたが言います " xlsファイルをインポートします "。 「csvファイルをインポートする」という意味ですか? CSVファイルを読み取ろうとしている場合は、実際のCSVパーサーを使用してください。グーグルがいくつか登場するはずです。 CSVを正しく解析することは、想定するほど単純ではありません。 – adv12

+0

最も簡単な解決策:デリミタをSemikolon **; **に切り替えます。あなたのcsvシートには複雑なテキストが含まれているので、コンマは一番良いセパレータではありません – lokusking

+0

申し訳ありません、それはcsvファイルですが、代わりにxlsファイルをインポートできます。 –

答えて

0

私は、使用Ado.Netを示唆..

コード例:

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader) 
{ 
    string header = isFirstRowHeader ? "Yes" : "No"; 

    string pathOnly = Path.GetDirectoryName(path); 
    string fileName = Path.GetFileName(path); 

    string sql = @"SELECT * FROM [" + fileName + "]"; 

    using(OleDbConnection connection = new OleDbConnection(
       @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
       ";Extended Properties=\"Text;HDR=" + header + "\"")) 
    using(OleDbCommand command = new OleDbCommand(sql, connection)) 
    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command)) 
    { 
     DataTable dataTable = new DataTable(); 
     dataTable.Locale = CultureInfo.CurrentCulture; 
     adapter.Fill(dataTable); 
     return dataTable; 
    } 
} 
関連する問題