如何在不导致字符截断的情况下将代码中的引号替换为将文本文件读取为CSV?

时间:2013-08-03 05:37:40

标签: c#

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

长话短说。我需要读取文本文件并创建为CSV。除了以下几个方面,情况看起来很好:

文件中的第一个列名被截断或削掉第一个字符: 示例:如果列名称为:音乐家,则结果如下: usician ,并切断其中所有数据的第一个字符列。

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

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

如果我写这样的代码:

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

然后该列如下所示: 音乐家“ ,因此包含第一列中标题的所有数据都以引号结尾。

如果我更改了索引位置,则所有内容都可以正常运行,除非文件末尾的多个数据被删除。

以下是完整代码:请注意我正在使用其他替换方法删除其他逗号,以便我可以在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();
}

感谢您的光临。

3 个答案:

答案 0 :(得分:1)

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

这是我的优化代码:

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

答案 1 :(得分:1)

您似乎尝试正确处理引号。您发布的代码不会显示此信息。正如您所知,它可以轻易导致一个错误。

我建议使用CSV阅读器库,例如one。它确实有效,它很可能更快,当然也更灵活。 如果您不喜欢外部库依赖项,则只需使用源代码并将其嵌入到项目中即可。这是一个非常小但非常好的代码。

答案 2 :(得分:0)

如果没有示例输入文件,有点难以知道你正在尝试做什么,但是为了回答你的问题,看起来迭代每行中的字符的目的是输出除第一行之外的所有字符字符。我想这可以删除围绕“Musician”的第一个引用,但是当你更改它以删除两个引号之前,它会删除数据的第一个字符。