所以,我有一个文本文件,其中包含成千上万行,其格式与此类似:
template <typename T>
bool get_vector(const std::size_t index,
const results_context_t& results,
std::vector<T>& v)
{
...
}
这些文件的长度几乎总是不同,我只需要读取该行的前两部分,即123456:0.8525000:1590882780:91011
。
我知道我可以使用C#分割每一行,但是我不确定如何只读取前两部分。有人对如何执行此操作有任何想法吗?抱歉,如果我的问题没有道理,可以在需要时重述。
答案 0 :(得分:2)
name
函数返回scratch.rkt> (define bday-list (list (birthday 'sam 25 'april)
(birthday 'erin 15 'april)
(birthday 'james 3 'april)
(birthday 'randi 7 'april)))
scratch.rkt> (bdayRange 6 17 bday-list)
'(erin randi)
,flutter create -i swift .
的数组。
只需将Split
的结果的前两个元素(以string[]
作为分隔符)即可。
string
请不要忘记Split
的元素是:
而不是 var read = "123456:0.8525000:1590882780:91011";
var values = read.Split(":");
Console.WriteLine(values[0]); // 123456
Console.WriteLine(values[1]); // 0.8525000
或values
的值。有关如何从字符串转换为数字类型的信息,请参见How to convert string to integer in C#。
答案 1 :(得分:0)
有很多方法可以做到这一点,但是我将建议一些涉及阅读整行的选项,因为它更易于使用/理解,并且您的行长不一。我确实在附录的末尾添加了关于在文件上使用StreamReader的建议,但是您可能需要弄清楚跳过不需要的行,在新行上重新启动char迭代循环等的认真工作。
我首先演示在NetCore 3.x中发现的最新,最出色的IAsyncEnumerable,然后介绍类似的基于字符串的方法。通过分享一个稍微先进且也将异步的Int示例,我希望在2020年也能帮助其他人并演示一种相当现代的方法。仅流出所需的数据将对保持数据的快速性和可用性具有巨大的好处。低内存占用。
public static async IAsyncEnumerable<int> StreamFileOutAsIntsAsync(string filePathName)
{
if (string.IsNullOrWhiteSpace(filePathName)) throw new ArgumentNullException(nameof(filePathName));
if (!File.Exists(filePathName)) throw new ArgumentException($"{filePathName} is not a valid file path.");
using var streamReader = File.OpenText(filePathName);
string currentLine;
while ((currentLine = await streamReader.ReadLineAsync().ConfigureAwait(false)) != null)
{
if (int.TryParse(currentLine.AsSpan(), out var output))
{
yield return output;
}
}
}
这会将每个int流式传输到文件之外,检查文件是否存在以及文件名路径是否为null或空白等。
对于初学者来说,流媒体可能太多了,所以我不知道您的水平。
您可能希望首先将文件转换为字符串列表。
将我上面的示例修改为不太复杂,但可以为您拆分字符串。我建议您学习有关流的知识,这样在您进行处理时就不会在内存中存储所有字符串了……或者您可能想要全部。我不是来这里评判的。
一旦从文件中获取字符串行,您就可以执行其他需要完成的工作。
public static async Task<List<string>> GetStringsFromFileAsync(string filePathName)
{
if (string.IsNullOrWhiteSpace(filePathName)) throw new ArgumentNullException(nameof(filePathName));
if (!File.Exists(filePathName)) throw new ArgumentException($"{filePathName} is not a valid file path.");
using var streamReader = File.OpenText(filePathName);
string currentLine;
var strings = new List<string>();
while ((currentLine = await streamReader.ReadLineAsync().ConfigureAwait(false)) != null)
{
var lineAsArray = currentLine.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
// Simple Data Validation
if (lineAsArray.Length == 4)
{
strings.Add($"{lineAsArray[0]}:{lineAsArray[1]}");
strings.Add($"{lineAsArray[2]}:{lineAsArray[3]}");
}
}
return strings;
}
代码的内容真的很简单,打开文件以供阅读!
using var streamReader = File.OpenText(filePathName);
然后遍历该文件...
while ((currentLine = await streamReader.ReadLineAsync()) != null)
{
var lineAsArray = currentLine.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
// Simple Data Validation
if (lineAsArray.Length == 4)
{
// Do whatever you need to do with the first bits of information.
// In this case, we add them all to a list for return.
strings.Add($"{lineAsArray[0]}:{lineAsArray[1]}");
strings.Add($"{lineAsArray[2]}:{lineAsArray[3]}");
}
}
这说明,对于我读出的不为空的每一行,请分成四个部分(基于“:”)字符,以删除所有空条目。
然后,我们使用一种称为String Interpolation($""
)的C#功能,将前两个字符与“:”放回字符串中。然后是第二个。或者您需要阅读该行的每一部分。
这实际上就是全部!希望对您有所帮助。
附录:如果您确实需要读取文件的某些部分,请使用StreamReader.Read和Peek()
using (var sr = new StreamReader(path))
{
while (sr.Peek() >= 0)
{
Console.Write((char)sr.Read());
}
}
答案 2 :(得分:0)
一些裸露的代码:
string fileName = @"c:\some folder\path\file.txt";
using (StreamReader sr = new StreamReader(fileName))
{
while (!sr.EndOfStream)
{
String[] values = sr.ReadLine().Split(":".ToCharArray());
if (values.Length >= 2)
{
// ... do something with values[0] and values[1] ...
Console.WriteLine(values[0] + ", " + values[1]);
}
}
}