我有一个包含
等数据的文本文件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表示每行文本文件。
问题是它将名称和路径拆分为多个字符串,但必须将它们视为单个字符串。我无法对文件进行任何更改,因为它是跨不同产品的标准文件。
我无法得到我能做的事。
答案 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;
}