2009-12-11 68 views
1

任何幫助將是偉大的請!我正在通過CSV導入Google通訊錄。問題是我可以像我在代碼中提到的那樣只獲取CSV文件的特定標題的值。任何人都可以在導入Google CSV文件時獲取源代碼以獲取整個集合嗎?.NET中的CSV文件導入

private void GoogleCsv() 
{ 
    StreamReader Sr = new StreamReader(Server.MapPath("CSVLoad//" + FileUpload.FileName)); 
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    string s; 
    Int64 count = 0, flag = 0; 
    while (!Sr.EndOfStream) 
    { 
     s = Sr.ReadLine(); 

     a = s.Split(',')[0]; 
     b = s.Split(',')[1]; 
     c = s.Split(',')[2]; 
     d = s.Split(',')[3]; 
     e = s.Split(',')[4]; 

     if (count == 0) 
     { 
      if ((a == "Name") && (b == "E-mail 1 - Value") && (c == "Phone 1 - Value") && (d == "Address 1 - Formatted") && (e == "Organization 1 - Name")) 
      { 
       flag = flag + 1; 
       count = count + 1; 
      } 
      else 
      { 
       break; 
      } 
     } 
     else if (count > 0) 
     { 
      if (flag == 1) 
      { 
       Contact contact = new Contact(); 
       contact.ContactFirstName = a; 
       contact.ContactLastName = ""; 
       contact.ContactEmail = b; 
       contact.CompanyName = e; 
       contact.ContactPhone = ""; 
       contact.MobileNo = c; 
       contact.Designation = d; 
       contact.Streetone = ""; 
       contact.Streettwo = ""; 
       contact.Area = ""; 
       contact.Userid = Convert.ToInt64(Session["UserId"].ToString()); 
       contact.Organizationid = Convert.ToInt64(Session["OrgId"].ToString()); 
       contact.Stateid = 19; 
       contact.Countryid = 2; 
       contact.Createdby = 106; 
       contact.Industryid = 287; 
       contact.Accgroupid = 627; 
       _importController.CsvImportDetails(contact); 
      } 
     } 
    } 
    Sr.Close(); 
    File.Delete(Server.MapPath("CSVLoad//" + FileUpload.FileName)); 
} 

回答

3

我使用這個CsvReader類來加載CSV數據,它是免費的,快速和易於使用。

+0

CsvReader將讀取整個CSV文件中,所有包括列。 – 2009-12-11 06:24:30

2

對於這樣的事情,我總是轉向FileHelpers。爲什麼要重新發明輪子,並與分隔符和所有這些瑣碎的細節鬥爭,當有解決所有這些低級別方面的解決方案?

只需定義要導入的類(基本上是字段列表),定義分隔符和忽略字段等,然後調用FileHelperEngine<T>.ReadFile()並完成它。

強烈推薦!

+0

我一直試圖使用這一次或兩次,很好的建議。 – 2009-12-11 10:12:49

0

一個有趣而優雅的選擇是LINQToCSV項目。

+0

經過測試LINQToCSV和LumenWorks(http://www.codeproject.com/KB/database/CsvReader.aspx)後,我決定第二個。易於使用,速度非常快。 – Oleiro 2010-12-08 13:54:14

0
class DynamicCSV : DynamicObject 
{ 
private Dictionary<String, int> _fieldIndex; 
private string[] _RowValues; 
public DynamicCSV(string currentRow, Dictionary<string, int> fieldIndex) 
{ 
    _RowValues = currentRow.Split(','); 
    _fieldIndex = fieldIndex; 
} 


public YOURLINQOBject export() { 
    return new YOURLINQOBject() 
} 

public DynamicCSV(string[] values, Dictionary<string, int> fieldIndex) 
{ 
    _RowValues = values; 
    _fieldIndex = fieldIndex; 
    //var that = new DynamicObject(); 
    //that.TrySetMember(
} 



private string TransitionName(string inputFieldName) 
{ 
    return Repo.TransitionThisName(inputFieldName); 
} 

public override bool TryGetMember(GetMemberBinder binder, out Object result) 
{ 
    var fieldName = binder.Name.ToUpperInvariant(); 
    if (_fieldIndex.ContainsKey(fieldName)) 
    { 
     result = _RowValues[_fieldIndex[fieldName]]; 
     return true; 
    } 
    result = null; 
    return false; 
} 


public override bool TrySetMember(SetMemberBinder binder, object value) 
{ 
    var fieldName = binder.Name.ToUpperInvariant(); 
    if (_fieldIndex.ContainsKey(fieldName)) 
    { 
     _RowValues[_fieldIndex[fieldName]] = value.ToString(); 
     return true; 
    } 
    return false; 
} 

public override string ToString() 
{ 
    var sb = new StringBuilder(); 
    sb.AppendLine("*******************************************"); 
    foreach (var field in _fieldIndex) 
    { 
     sb.AppendLine(field.Key + " --- " + _RowValues[_fieldIndex[field.Key]]); 
    } 
    sb.AppendLine("*******************************************"); 
    return sb.ToString(); 
} 

}

然後以所有的線加載一起

public class DynamicCSVEnum : IEnumerable 
{ 
    private PeopleEnumerator _peopleEnum; 
    public DynamicCSVEnum(string filename) 
    { 
     _peopleEnum = new PeopleEnumerator(filename); 
    } 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     // return a PeopleEnumerator 
     return _peopleEnum; 
    } 
} 


public class PeopleEnumerator : IEnumerator 
{ 
    //private List<MKG> theList; 
    //private int _currentIndex; 

    private Microsoft.VisualBasic.FileIO.TextFieldParser _FileStream; 
    private Dictionary<string, int> _FieldNames; 
    private DynamicCSV _CurrentRow; 
    private string _filename; 

    public PeopleEnumerator(string filename) 
    { 
     _filename = filename; 
     //theList = new List<MKG>(); 
     //theList.Add(new MKG() { Id = 0 }); 
     //theList.Add(new MKG() { Id = 1 }); 
     //theList.Add(new MKG() { Id = 2 }); 
     //_currentIndex = -1; 
     GetEnumerator(); 
    } 

    private void GetEnumerator() 
    { 
     _FileStream = new Microsoft.VisualBasic.FileIO.TextFieldParser(_filename); 
     _FileStream.Delimiters = new String[] { "," }; 
     _FileStream.HasFieldsEnclosedInQuotes = true; 
     _FileStream.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited; 
     var fields = _FileStream.ReadFields(); 
     _FieldNames = new Dictionary<string, int>(); 
     for (var i = 0; i <= fields.Length - 1; i++) 
     { 
      _FieldNames.Add(GetSafeFieldName(fields[i]), i); 
     } 
     _CurrentRow = new DynamicCSV(_FileStream.ReadFields(), _FieldNames); 
    } 
    public void Reset() 
    { 
     //_currentIndex = 0; 
     _FileStream.Close(); 
     GetEnumerator(); 
    } 

    public bool MoveNext() 
    { 
     //_currentIndex++; 
     //if (_currentIndex < theList.Count) 
     //{ 

     // return true; 
     //} 
     //return false; 
     var line = _FileStream.ReadFields(); 
     if (line != null && line.Length > 0) 
     { 
      _CurrentRow = new DynamicCSV(line, _FieldNames); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public object Current 
    { 
     //get 
     //{ 
     // return theList[_currentIndex]; 
     //} 
     //set 
     //{ 
     // theList[_currentIndex] = (MKG)value; 
     //} 
     get { return _CurrentRow; } 

    } 

    string GetSafeFieldName(string input) 
    { 
     return input.Replace(" ", "").Replace("_", "").Replace(".","").Replace("#","").Replace("/","").Replace("\\","").ToUpperInvariant(); 
    } 

} 

然後所需要的是一個簡單的

  var foo = new DynamicCSVEnum(savedFileName); 

      foreach (DynamicCSV item in foo) 
      { 
       retVal.Add(item.LinqObjectExport()); 
      } 

      foreach (var item in retVal) 
      { 
       item.ClientSet = dsid; 
      } 
      repo.InsertDataSet(retVal); 
+0

非常感謝你!!!!!! – renisha 2009-12-14 04:45:29