读取用文本文件中的双引号括起来的字符串

时间:2010-07-30 08:22:47

标签: c# string

我有一个包含

等数据的文本文件
ID        Name          Path                                    IsTrue        Period
1         "1 yr"        "C:\\Program Files\\My File.xyz"        -1            2"
1         "1 yr"        "C:\\Program Files\\My File.xyz"        -1            2"

现在我有以下代码来分割行

string[] ArrSeperators = { " " };
ArrSplitStrs = CurrStr.Split(ArrSeperators,
                             StringSplitOptions.RemoveEmptyEntries);

CurrStr表示每行文本文件。

问题是它将名称和路径拆分为多个字符串,但必须将它们视为单个字符串。我无法对文件进行任何更改,因为它是跨不同产品的标准文件。

我无法得到我能做的事。

3 个答案:

答案 0 :(得分:1)

使用这样的算法:

一次处理每一行的每个字符。

计算你找到的每一个。

如果“s的数量是奇数,你知道你需要继续阅读当前字段,直到你击中另一个字段”。

如果“s的数量是偶数,你知道只要你进入一个空间,你就会进入下一个领域。

类似的东西(这可能有错误 - 我刚刚把它写在了我的头顶):

StringBuilder field = new StringBuilder();
int quoteCount = 0;

foreach (char c in line)
{
    if (c == '"')
    {
        quotCount++;
        continue;
    }

    if (quoteCount % 2 = 0)
    {
        if (c == ' ')
        {
            yield return field.ToString();
            field.Length = 0;
        }
        else
        {
            field.Append(c);
        }
    }
    else
    {
        field.Append(c);
    }
}

修改

这是一个适用于您的示例的hacky示例 - GetFields方法需要一些重构,这远远不是我在代码中添加的任何内容的质量,但基本原则就在那里。 / p>

class Program
{
    static void Main(string[] args)
    {
        var records = ReadFile(@"D:\x.txt");

        foreach (var record in records)
        {
            foreach (var field in record)
            {
                Console.Write(field + " | ");
            }

            Console.WriteLine();
        }

        Console.ReadKey();
    }

    static IEnumerable<IEnumerable<String>> ReadFile(String file)
    {
        using (var reader = new StreamReader(file))
        {
            // Ignore column titles line.
            reader.ReadLine();

            while (!reader.EndOfStream)
            {
                yield return GetFields(reader.ReadLine());
            }
        }
    }

    static IEnumerable<String> GetFields(String line)
    {
        Int32 quoteCount = 0;
        StringBuilder field = new StringBuilder();

        foreach (var c in line)
        {
            if (c == '"')
            {
                quoteCount++;
                continue;
            }

            if (quoteCount % 2 == 0)
            {
                if (c == ' ')
                {
                    if (field.Length > 0)
                    {
                        yield return field.ToString();
                        field.Length = 0;
                    }
                }
                else
                {
                    field.Append(c);
                }
            }
            else
            {
                field.Append(c);
            }
        }

        yield return field.ToString();
    }
}

答案 1 :(得分:0)

如果使用制表符分隔符分隔字段,则可以使用'\ t'。

答案 2 :(得分:0)

尝试以下代码。使用提供的样本进行测试...

string CurrStr = "1         \"1 yr\"        \"C:\\Program Files\\My File.xyz\"        -1            2\"";
string[] ArrSplitStrs = CurrStr.Split('"');
int HighestCount = ArrSplitStrs.Count() % 2 == 0 ? ArrSplitStrs.Count() : ArrSplitStrs.Count() - 1;
for (int Counter = 1; Counter < HighestCount; )
{
    Console.WriteLine(ArrSplitStrs[Counter]);
    Counter += 2;
}