0

我有一个 csv 文件,它有一个标题行和 2 个数据行,但有时我们会从源代码中将数据行分成多行,在下面的情况下,它是 3 行。

在此处输入图像描述

因此,我的 SSIS 包在通过 C# 代码处理此 csv 文件时失败,因为它将“ETF”行视为新行。我目前正在使用下面的代码将所有数据添加到数组列表中。

            string sLine;
            ArrayList arrText = new ArrayList();
            StreamReader objReader = new StreamReader(filepath);

            do
            {
                sLine = objReader.ReadLine();
                if (sLine != null)
                    arrText.Add(sLine);
            }
            while (sLine != null);

我是 C# 的新手,所以任何人都可以建议我们如何处理这种情况,以便我的代码可以处理这个文件 2 只有 2 行而不是 3 行并将其加载到数据库中。

4

3 回答 3

0

现在...我觉得这不是一个好主意。一个好主意是使用 .net 的 CSV 库之一,加载文件,用空格替换换行符,将文件重写为 csv。

这不是一个好主意。这是一个正则表达式的想法。

string csv = File.ReadAllText("sample.csv");

string separator = "#";
string escapedDoubleQuotes = "\"\"";
var rx = new Regex($@"(?<=^ *|{Regex.Escape(separator)} *)""({Regex.Escape(escapedDoubleQuotes)}|[^""])*""", RegexOptions.Multiline);
var replacer = new Regex(" *[\r\n]+ *");

string csv2 = rx.Replace(csv, x => replacer.Replace(x.Value, " "));

File.WriteAllText("output.csv", csv2);

它将用单个空格替换\r和/或(加上周围的可选空格)的序列。\n正则表达式将尝试在 csv 中查找双引号字符串,“提取”它们,然后replacer用一个空格进行一些替换(使用第二个正则表达式,称为 )。甚至支持转义双引号。默认情况下,要在值中插入双引号",您必须将其""加倍。

于 2021-01-05T15:08:45.157 回答
0

假设每一行都以日期开头并且没有其他字段是日期,您可以简单地将所有文本作为一个字符串读取并删除每个没有紧跟日期的 \r\n :

string csv = File.ReadAllText(filename);
csv = Regex.Replace(csv, "\r\n(?!(\"[0-9]+/))", "$1");
arrtext.AddRange(csv.Split("\r\n"));

这不是给定日期格式的完整模式,但适用于示例。

于 2021-01-05T15:09:46.690 回答
0

使用 Microsoft.VisualBasic.FileIO.TextFieldParser 读取 csv 文件或参考这个这个

于 2021-01-05T14:46:54.970 回答