0

我已尝试搜索但无法理解或解决此问题。

长话短说。我需要读取一个文本文件并创建为 CSV。除了以下领域外,一切看起来都不错:

文件中的第一个列名被截断或删除第一个字符:示例:如果列名是:Musician,那么结果是:usician,并截断该列中所有数据的第一个字符。

当我这样做时会发生这种情况:

foreach (string line in s.Replace("\"", "").Split('\n'))

如果我这样写代码:

foreach (string line in s.Replace("\r", "").Split('\n'))

然后该列看起来像这样:Musician",因此包括第一列中的标题在内的所有数据都以引号结尾。

如果我更改索引位置,一切正常,除了文件末尾的几个数据被剃掉。

这是完整的代码:请注意,我正在使用附加的替换方法来删除附加的逗号,以便我可以在 SSIS 中使用该文件。这是我需要这个的主要原因。

static void TxtToCSV(string s, TextWriter writer)
{
foreach (string line in s.Replace("\r", "").Replace(", ", "").Split('\n'))
{
    for (int i = 0; i < line.Length; i++)
    {
        if (i > 0)
            writer.Write(line[i]);
    }
    writer.WriteLine();
}
}

static void Main(string[] args)
{
TextReader reader = new StreamReader(@"C:\folder\sample\test.txt");
string a = reader.ReadToEnd();
reader.Close();

FileStream aFile = new FileStream(@"C:\folder\sample\test.csv", FileMode.Create);
TxtToCSV(a, new StreamWriter(aFile));
aFile.Close();
}

感谢您的关注。

4

3 回答 3

1

您没有写下该行的第一个字母。我还将您对回车和换行符的替换合并到一个对 Environment.NewLine 的替换中。您还应该在关闭或将 writer.Autoflush 属性设置为 true 之前刷新 writer。

这是我的优化代码:

    static void TxtToCSV(string s, TextWriter writer)
    {
        foreach (var line in s.Replace(", ", "").Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
        {
            foreach (var t in line)
            {
                writer.Write(t);
            }
            writer.WriteLine();
        }
        writer.Flush();
    }
于 2013-08-03T05:52:12.810 回答
1

您似乎尝试正确处理引号。您发布的代码未显示此内容。正如您已经发现的那样,它很容易导致一个错误。

我建议使用 CSV 阅读器库,例如这个。它确实有效,而且它很可能比您当前的代码更快,当然也更灵活。如果您不喜欢外部库依赖项,您可以简单地使用源代码并将其嵌入到您的项目中。它很小但非常好的代码。

于 2013-08-03T05:56:09.393 回答
0

如果没有示例输入文件,很难确切地知道您要做什么,但是为了回答您的问题,看起来迭代每行中的字符的目的是输出除第一个字符之外的所有字符。我想这可以删除“Musician”周围的第一个引号,但是当您更改它以在它之前删除两个引号时,数据的第一个字符被省略了。

于 2013-08-03T06:02:34.523 回答