1

Any help would be great please! I'm importing Google contacts by CSV. The problem is I can get the value of only specific header of the CSV file as I mentioned in the code. Can anyone get me the source code to get the entire set while importing the Google CSV file?

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));
}
0

4 Answers 4

3

I use this CsvReader class for loading CSV data, it's free, fast and easy to use.

Sign up to request clarification or add additional context in comments.

1 Comment

CsvReader will read the entire CSV file, all columns included.
2

For anything like that, I always turn to FileHelpers. Why reinvent the wheel and struggle around with delimiters and all those gnary details when there's a solution out there that deals with all those low-level aspects already??

Just define the class you want to import (the list of fields, basically), define the delimiters and ignored fields etc., and then just call FileHelperEngine<T>.ReadFile() and be done with it.

Highly recommended!

1 Comment

I've been tempted to use this once or twice, good to here a recommendation.
0

One interesting and elegant option is the LINQToCSV project.

1 Comment

After testing LINQToCSV and LumenWorks (codeproject.com/KB/database/CsvReader.aspx), I decided for the second one. Easy to use and really fast.
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();
}

}

Then in order to load all the lines together

 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();
    }

}

Then all it takes is a simple

            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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.