在拆分

时间:2017-03-20 13:02:11

标签: c# csv datatable streamreader

我正在尝试在我的数据库中读取并上传某个csv文件,其中包含用户选择的某些数据。让我们说数据包含姓名,年龄和身高。问题是名称包含逗号(,)。

示例:

马克,史密斯20 170

由于系统会认为这是另一个领域并将分裂。下面是我正在使用的代码,我需要过滤这个逗号并在拆分成不同的列之前删除它。

openFileDialog1.ShowDialog();
            var fileName = string.Format(openFileDialog1.FileName);

            StreamReader sr = new StreamReader(fileName);
            string line = sr.ReadLine();
            string[] value = line.Split(',');
            DataTable dt = new DataTable();
            DataRow row;
            foreach (string dc in value)
            {
                dt.Columns.Add(new DataColumn(dc));
            }

            while (!sr.EndOfStream)
            {
                value = sr.ReadLine().Split(',');
                Name cl = new Name();
                try
                {
                    cl.Name= value[0].Trim('"');
                    cl.Age= value[1].Trim('"');
                    cl.Height= value[2].Trim('"');

new Data().addPerson(cl);
}

1 个答案:

答案 0 :(得分:0)

这是一个快速的&脏的解决方案我一起做了标记。使用正则表达式可能会有更优雅的解决方案。但是嘿,它有效......

using System.Text;

var line = "\"Mark, Fenech\", \"20\", \"170\"";

public static string RemoveColumnDelimitersInsideValues(string input) {

    const char valueDelimiter = '"';
    const char columnDelimiter = ',';

    StringBuilder output = new StringBuilder();

    bool isInsideValue = false;
    for (var i = 0; i < input.Length; i++) {
        var currentChar = input[i];

        if (currentChar == valueDelimiter) {
            isInsideValue = !isInsideValue;
            output.Append(currentChar);
            continue;
        }

        if (currentChar != columnDelimiter || !isInsideValue) {
            output.Append(currentChar);
        }
        // else ignore columnDelimiter inside value
    }
    return output.ToString();
}

.Net Fiddle