2013-05-30 4 views
1

다음 코드는 CSV 파일을 입력 한 다음 변환하여 CSV 파일을 출력합니다. CSV 읽기에 FileHelper를 사용하고 있습니다. 나는 그것에 몇 가지 문제가있다. 첫째, 필드 정보가있는 추가 행이 삽입됩니다 (아래 참조). 두 번째 문제는 큰 따옴표를 추가하여 쉼표가 포함 된 셀에 문자열을 포함 할 수 있다는 것입니다. 포맷팅에 문제가있는 것은 아니지만 Excel로 가져 오지 않고 큰 따옴표와 첫 번째 항목 만 보여줍니다. Excel로 가져올 때 이스케이프 텍스트 옵션에 큰 따옴표를 사용하여 시도했습니다. 세 번째 문제는 일부 필드가 비어있어 나중에 필드가 오프셋된다는 것입니다. 필드의문자열 및 쉼표로 된 문자열 문제

두 번째 줄 :

, base, 0, 0, 0, Product Name, Size, Brand, Gender, Type, SKU, Stock, Sí, "Photo1, Photo2, Photo3", Photo1, Photo1, Photo1 

코드 :

using System; 
using FileHelpers; 
using System.IO; 

[DelimitedRecord(";")] 
public sealed class StoreItems 
{ 

[FieldOptional()] 
public String Attribut; 

[FieldOptional()] 
public String ProductName; 

[FieldOptional()] 
public String Size; 

[FieldOptional()] 
public String Brand; 

[FieldOptional()] 
public String Type; 

[FieldOptional()] 
public String ParentSKU; 

[FieldOptional()] 
public String SKU; 

[FieldOptional()] 
public String Stock; 

[FieldOptional()] 
public String RetailEURO; 

[FieldOptional()] 
public String SuggestedsellEURO; 

[FieldOptional()] 
public String Weight; 

[FieldOptional()] 
public String Description; 

[FieldOptional()] 
public String Photo1; 

[FieldOptional()] 
public String Photo2; 

[FieldOptional()] 
public String Photo3; 

[FieldOptional()] 
public String Gender; 

[FieldOptional()] 
public String EAN13; 
} 

public class RunProgram 
{ 
    public static void Main() 
    { 
     FileHelperEngine engine = new FileHelperEngine(typeof(StoreItems)); 
     StoreItems[] res = engine.ReadFile("Presta.csv") as StoreItems[]; 

     Directory.CreateDirectory("Output"); 
     StreamWriter sw = new StreamWriter(@".\Output\" + DateTime.Now.ToString("hhmmss") + ".csv"); 
     sw.AutoFlush = true; 
     Console.SetOut(sw); 

     Console.WriteLine("_type, _product_websites, tax_class_id, _visibility, is_in_stock, name, taglia, manufacturer, gender, _attribute_set, sku, qty, use_external_images, external_gallery, " + 
      "thumbnail_external_url, small_image_external_url, image_external_url"); 

     foreach(StoreItems item in res) 
     { 
      string newtype = null; 
      int visibility = 0; 

      if (item.Attribut == "Parent") 
      { 
       newtype = "Configurable"; 
       visibility = 4; 
      } 
      else if (item.Attribut == "Child") 
      { 
       newtype = "Simple"; 
       visibility = 1; 
      } 

      int isinstock; 

      int stockint; 

      try 
      { 
       stockint = Convert.ToInt32(item.Stock); 
      } 
      catch 
      { 
       stockint = 0; 
      } 

      if (stockint > 0) 
      { 
       isinstock = 1; 
      } 
      else 
      { 
       isinstock = 0; 
      } 


      Console.WriteLine(newtype + ", base, 0, " + visibility + ", " + isinstock + ", " + item.ProductName + ", " + item.Size + ", " + 
       item.Brand + ", " + item.Gender + ", " + item.Type + ", " + item.SKU + ", " + item.Stock + ", Sí, " + @""""+item.Photo1+ ", "+item.Photo2+", "[email protected]"""" + ", " + item.Photo1 + ", " + item.Photo1 + 
       ", " + item.Photo1); 

     } 



    } 


} 

편집 : 난 그냥 두 번째 줄은 입력 파일의 읽기에서 추가되는 것을 깨달았다. 첫 번째 줄을 무시하는 방법을 찾아야합니다. 필드도 더 이상 상쇄되지 않는 것처럼 보입니다. 이제 csv에서 쉼표를 사용하는 방법은 무엇입니까?

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

0

두 번째 문제;

쉼표를 구분 기호로 사용할 필요가 없으며 원하는 문자를 사용할 수 있습니다. 따라서 빠른 수정으로 출력에서 ​​','구분 기호를 '|'로 변경하지 마십시오.

물론 '|' 귀하의 텍스트에서, 이것은 도움이되지 않을 수도 있지만 그렇지 않다면 - 당신을 빨리 얻을 수있는 수정.

0

하나의 문제; 너는 가지고있다.

string newtype = null; 
int visibility = 0; 

if (item.Attribut == "Parent") 
{ 
    newtype = "Configurable"; 
    visibility = 4; 
} 
else if (item.Attribut == "Child") 
{ 
    newtype = "Simple"; 
    visibility = 1; 
} 

는 "부모"또는 "아이"정확히 다음 newtype가 설정되어 있지되지 item.Attribut이 경우 둘. 따라서 예제 출력의 첫 번째 필드가 비어있는 이유는 무엇입니까?

+0

예, 알고 있습니다. 필자가 작업하고있는 파일은 필드가 비어 있지 않으면 항상 그 중 하나를 갖습니다. 그래서 첫 번째 필드에'newtype'을 사용하고 원래 필드가 그것들 중 어느 것도 아닌 경우 공백을 반환합니다. 당신의 다른 대답에 관해서는, 그것은 좋은 생각입니다! 파일이 들어갈 프로그램이 해당 서식을 허용하는지 확인하기 만하면됩니다. – danielunderwood

관련 문제