【问题标题】:StreamReader Read random lineStreamReader 读取随机行
【发布时间】:2014-03-25 08:58:59
【问题描述】:

有没有办法通过 CSV 文件以随机顺序生成StreamReader ReadLine()

例子:

StreamReader reader = new StreamReader(File.OpenRead(@"C:\\file.csv"));
String firstName = reader.ReadLine().ToString();
Console.WriteLine(firstName);

【问题讨论】:

  • 是的。也许你可以告诉我们你尝试了什么?
  • 你能一次将整个文件加载到内存中吗?如果可以,这很容易,如果不能,这将变得非常缓慢或令人讨厌。

标签: c# streamreader


【解决方案1】:

StreamReader 按定义顺序读取。我能想到的只是文件不是很大

var lines File.ReadAllLines(@"C:\\file.csv")

Random random = new Random((int)DateTime.Now.Millisecond);
List<T> sortedList = lines.OrderBy(x => random.Next()).ToList();

【讨论】:

  • 如果你的随机数大于你的行数怎么办?
  • 没关系。随机数仅用于对行进行排序。所以实际上它只是获取行,然后分配一个随机数给它排序。
  • 我明白了。我不知道读取一个大文件然后排序所有行以选择一个随机行是不是最好的主意?
  • 这是一个非常巧妙的解决方案(如果您查看一下现在所有内容都在内存中的部分,因为我不知道有什么方法可以真正解决这个问题)。实际上,您可以为任何类型使用 Shuffle 扩展方法,然后在线调用它。即lines.shuffle,如果你想随机遍历所有这些。如果他只想要一条随机线,那么是的……有点矫枉过正
  • 他的第一句话似乎暗示他想要一个随机的顺序,而不仅仅是一行。
【解决方案2】:

StreamReader 只能向前,无法向后移动,但可以先使用 File.ReadAllLines 将所有行读入内存:

string[] allLines = File.ReadAllLines(@"C:\\file.csv");
Random rnd = new Random();
List<string> randomLines = new List<string>(allLines.Length);
for(int i = 0; i < allLines.Length ; i++)
{
    randomLines.Add(allLines[rnd.Next(allLines.Length)]);
}

【讨论】:

    【解决方案3】:

    使用 C# 的 Random 类生成一个随机数,您将使用该随机数从文件中选择一行。

    File.ReadLines() 不必读取整个文件,您可以使用 LINQ 构建查询来过滤它读取的行:

    返回值类型:System.Collections.Generic.IEnumerable All 文件的行,或查询结果的行。

    但是,在这种情况下,我们需要全部阅读以找到行数。

    // Read lines
    string[] lines = File.ReadLines(@"C:\file.csv");
    
    // Seed a random number in the range 0 to your count
    var r = new Random();
    int randomNumber = r.Next(0, lines.Length);
    
    // Read the random line
    string line = lines.Skip(randomNumber - 1).Take(1).First();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2016-09-03
      相关资源
      最近更新 更多