我有这样一句话:
114765 * 3 * 659300 * 01 * 17/01/2013 * * 1 * Chuck Norris * Chuck Norris Jr* Owner * 1 * 28/04/1983 * Conjuge * * * 16/1/2013 * 1 * Quadro Social *
正如您所看到的,内容/字段由*
分隔,它们是matriculation, name, dependent's name, category
等字段...我想知道我怎么能一个接一个地读取它?
此外,我需要对此进行重新排序并编写一个新的file.txt,这些内容重新排序且没有*
...我完全迷失了!
在我阅读并删除*
后,我需要将其替换为\field\
:
\114765\\3\\659300\\01\\17/01/2013\\1\\Chuck Norris\
我尝试了substring()
和StreamWriter
StreamReader
ReadLine
,但我不能做我需要的事情; \
答案 0 :(得分:3)
使用String.Split
获取string[]
列。您可以使用String.Join
将所有部分连接到一个新字符串,然后File.WriteAlltext
或File.WriteAllLines
将其写回。
读完后删除*我需要替换它们,如\ field \:
因此,您需要将*
替换为\
:
string[] parts = line.Split(new[] { '*' }, StringSplitOptions.RemoveEmptyEntries);
string newLine = string.Join("", parts.Select(p => string.Format("\\{0}\\", p.Trim())));
File.WriteAllText(filePath, newLine);
结果:
\114765\\3\\659300\\01\\17/01/2013\\\\1\\Chuck Norris\\Chuck Norris Jr\\Owner\\1\\28/04/1983\\Conjuge\\\\\\16/1/2013\\1\\Quadro Social\\\
更新:
如果你想忽略空的部分(由字符串中的两个连续* *
引起),那么你可以使用这段代码:
var nonEmptyParts = parts
.Where(p => !string.IsNullOrWhiteSpace(p))
.Select(p => string.Format("\\{0}\\", p.Trim()));
string newLine = string.Join("", nonEmptyParts);
这将导致:
\114765\\3\\659300\\01\\17/01/2013\\1\\Chuck Norris\\Chuck Norris Jr\\Owner\\1\\28/04/1983\\Conjuge\\16/1/2013\\1\\Quadro Social\
我想忽略数组的前2个字符串,你知道的 把它取下来扔掉
那是Enumerable.Skip
:
var nonEmptyParts = parts.Skip(2)
.Where(p => !string.IsNullOrWhiteSpace(p))
.Select(p => string.Format("\\{0}\\", p.Trim()));
答案 1 :(得分:1)
readline是您从文本文件中读取一行所需的内容。一旦你在字符串中包含整行,就可以使用Split方法。
line.Split('*');
会给你一系列字符串。
答案 2 :(得分:0)
一次读取一行文件,然后使用
myLine.split('*');
这会将字符串分成一个数组,将其分成只有'*'的地方。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/y7h14879.aspx。
当您想要将其写回到另一个文件时,您应该能够根据需要排列数组中的项目并使用StreamWriter编写它们,确保传入新的文件名。有关示例,请参阅http://www.dotnetperls.com/streamwriter。
答案 3 :(得分:0)
如何重新排序文件中的行?只需将fieldToSortBy的值更改为其他数字字段的顺序。
using System.IO;
using System.Linq;
namespace FileSorter
{
class Program
{
static void Main(string[] args)
{
var fieldToSortBy = 0;
//data.txt contains lines like 114765 * 3 * 659300 * 01 * 17/01/2013 * * 1 * Chuck Norris * Chuck Norris Jr* Owner * 1 * 28/04/1983 * Conjuge * * * 16/1/2013 * 1 * Quadro Social *
var lines = File.ReadAllLines(@"C:\temp\data.txt");
var splitLines = lines.Select(l => l.Split('*'));
var orderedLines = splitLines.OrderByDescending(l => int.Parse(l[fieldToSortBy].Trim()));
var joinedLines = orderedLines.Select(l => string.Join("*", l));
File.WriteAllLines(@"C:\temp\output.txt", joinedLines);
}
}
}