gpt4 book ai didi

f# - 使用 FSharp CsvParser 读取 "Awkward"CSV 文件

转载 作者:行者123 更新时间:2023-12-04 17:57:24 25 4
gpt4 key购买 nike

我有一个大文件(200K - 300K 行文本)。它几乎但不完全是 CSV 文件。

  1. 列标题在第二行,有一行虚拟文本
    在此之前。

  2. 有些行与实际数据行交织在一起。他们有逗号,但大多数列都是空白的。它们与我无关。

我需要有效地读取这个文件,并解析实际的行有效,作为 CSV 数据。

我的第一个想法是编写一个干净的程序,去掉第一行和空行,只留下我想要的标题和细节在 CsvParser 可以读取的 CSV 文件中。

这很简单,只需来自 StreamReader 的 ReadLine,我可以通过将其视为字符串来保留或忽略每一行。

现在虽然我有一个新问题。

我可以使用有效数据中的一列来忽略更多行。

如果我使用 CsvParser 读取已清理文件,则很容易按该列进行过滤。

但是,我真的不想浪费时间将不需要的行写入 Clean 文件。

我希望能够在清理文件时检查该列。但是,那时我正在处理代表整行的字符串。很难找到我想要的特定列。

我不能在','上拆分其他列的文本中可能有逗号。我最终要编写 Csv 解析逻辑,我首先使用 CsvParser。

理想情况下,我想读取现有文件,根据字符串清除我可以清除的行,然后使用 CsvParser 以某种方式解析生成的序列。

我看到 CsvFile 可以从 Streams 和 Readers 加载,但我不确定这有多大帮助。

有什么建议还是我要求太多了?我应该只处理加载清理文件时的额外过滤吗?

最佳答案

您可以通过直接使用 CsvFile 类来避免执行大部分解析工作。

F# Data documentation有一些扩展示例详细说明了如何执行此操作。

跳过文件开头的行由 skipRows 参数处理。传递 ignoreErrors 参数也将忽略无法解析的行。

open FSharp.Data
let csv = CsvFile.Load(file, skipRows=1, ignoreErrors=true)
for row in csv.Rows do
printfn "%s" row.GetColumn "Name"

如果您必须对行进行更复杂的过滤,一种不需要临时文件的简单方法是过滤 File.ReadLines 的结果并将其传递给 CsvFile.Parse

下面的示例跳过了一个六行的前奏,逐行读取直到遇到空白行,使用 CsvFile 解析数据,最后将结果行过滤为感兴趣的行。

let tableA =
File.ReadLines(file)
|> Seq.skip(6)
|> Seq.takeWhile(fun l -> String.length l > 0)
|> String.concat "\n"

let csv = CsvFile.Parse(tableA)
for row in csv.Rows.Filter(fun row -> row?Close.AsFloat() > row?Open.AsFloat()) do
printfn "%s" row.GetColumn "Name"

关于f# - 使用 FSharp CsvParser 读取 "Awkward"CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com