C# 从另一个数组替换数组字段

C# 从另一个数组替换数组字段,c#,arrays,string,replace,import-from-csv,C#,Arrays,String,Replace,Import From Csv,我有一个小程序,它读取一个CSV文件,其中包含一个以逗号分隔的报告。在报告中,其中一个字段是日期,我将其转换为日期/时间,并且仅提取特定时间范围内的信息。但我的问题是:报告实际上是在某个系统上运行的作业列表。但是,有些作业名称本身包含逗号。这意味着Excel输出报告非常混乱,因为如果作业名称带有逗号,则作业名称将被划分为两个单元格。我对编程有点陌生,所以解决这个问题的唯一方法就是检查数组中有多少字段以逗号分隔。如果它大于正常值,我会连接两个字段,我知道这两个字段将是作业名称。但是,问题是,如果作

我有一个小程序,它读取一个CSV文件,其中包含一个以逗号分隔的报告。在报告中,其中一个字段是日期,我将其转换为日期/时间,并且仅提取特定时间范围内的信息。但我的问题是:报告实际上是在某个系统上运行的作业列表。但是,有些作业名称本身包含逗号。这意味着Excel输出报告非常混乱,因为如果作业名称带有逗号,则作业名称将被划分为两个单元格。我对编程有点陌生,所以解决这个问题的唯一方法就是检查数组中有多少字段以逗号分隔。如果它大于正常值,我会连接两个字段,我知道这两个字段将是作业名称。但是,问题是,如果作业名称包含2个逗号,这将不起作用,因为它只设置为处理数据中的1个额外逗号

我应该补充一点,我读入的CSV报告是由另一个应用程序生成的,我无法控制它的分隔方式。否则,我会把它改成管道之类的东西

有什么想法吗?下面是处理此问题的代码部分:

StreamReader SR = new StreamReader(inputFile);
StreamWriter SW = new StreamWriter(outputFile);
string records;
//read headers from first line
string headers = records = SR.ReadLine();
SW.WriteLine(headers);
DateTime YesterdayAM = Convert.ToDateTime(DateTime.Now.AddDays(-1).ToShortDateString() + " 05:00:00 AM");
while ((records = SR.ReadLine()) != null)
{
    if (records.Trim().Length > 0)
    {
        string daterecord = GetDateTimeFromStringArray(records);
        if (daterecord.Length > 0)
        {
            DateTime recordDate = Convert.ToDateTime(daterecord);
            if (recordDate >= YesterdayAM)
            {
                string[] checkfields = records.Split(',');
                if (checkfields.Length > 13)
                {
                    string[] replacefields = { checkfields[0], checkfields[1] + " " + checkfields[2], checkfields[3], checkfields[4], checkfields[5], checkfields[6], checkfields[7], checkfields[8], checkfields[9], checkfields[10], checkfields[11], checkfields[12] };
                    for (int i = 0; i < replacefields.Length; i++)
                    {
                        SW.Write(replacefields[i] + ",");
                    }
                    SW.Write(Environment.NewLine);
                }
                else
                {
                    SW.WriteLine(records);
                }
            }
        }
    }
}

这样做有点不妥,但如果您无法修复源代码,并且您知道额外的逗号只会出现在一个字段中,您可以这样做:

            string[] checkfields = records.Split(',');
            while (checkfields.Length > 13)
            {
                 // concat [1] & [2] into a new array
                 checkfields = checkfields.Take(1)
                     .Concat(new string[] { string.Join("", checkfields.Skip(1).Take(2).ToArray()) })
                     .Concat(checkfields.Skip(3)).ToArray();
            }    // if it's still too long it will loop again
或者更好:

            string[] checkfields = records.Split(',');
            int extraFields = checkfields.Length - 13;
            if (extraFields > 0) 
            {
                 // concat fields 1....1 + extraFields
                 checkfields = checkfields.Take(1)
                     .Concat(new string[] { string.Join("", checkfields.Skip(1).Take(extraFields).ToArray()) })
                     .Concat(checkfields.Skip(extraFields + 1)).ToArray();
            }    // avoids looping by doing it all in one go

注意:linq语句未经测试,可能不是绝对最有效的方法。此外,为了便于维护,所有的幻数可能都应该替换为常量

我认为这是一个类似的问题:一般来说,在CSV文件中,如果您的单元格包含分隔符,它应该用引号括起来。这就是Excel在保存为CSV时对任何包含逗号的单元格所做的操作。如果这是完全不可能的,那么使用您描述的技术,您可以通过调用方法再次连接字段,直到长度正确为止,从而处理作业名称字段中的多个逗号。非常感谢!我很感激。我要试试你的第二种方法。