簡體   English   中英

從Scala中的CSV文件讀取

[英]Reading from CSV file in scala

我有一個文件,其中包含有關特定人群的不同數據信息。

文件格式示例:

1880,Mary,F,7065
1880,Anna,F,2604
1880,Emma,F,2003
1880,Elizabeth,F,1939

我們可以將數據解釋為“ 1880年,出生了7065個名叫瑪麗的女嬰”

我有一個從文件讀取的功能

fromFile(name:String):List[List[String]]

fromFile返回列表列表:

清單(List(“(1880”,“ Mary”,“ F”,“ 7065”))

我在弄清楚如何獲取數據並將其解析為這樣的函數時遇到了麻煩,該函數需要一個嵌套列表和一個數字,並返回此類年份的條目列表。 例如,如果“ n”為1880,則返回列表將返回有關Mary的所有信息。

 object readFile{
  val years = CSV.fromFile("my_file.csv") 

def yearIs(data: List[List[String]], n: Int): List[List[String]] = 
      ??
}

我試圖弄清楚如何訪問返回列表中的每個元素,並將其與給定的“ int”進行比較,然后返回所有數據。

我總是建議首先將輸入數據轉換為適當的結構,並進行所有轉換,並可能進行錯誤報告,然后再執行所需的操作。

因此,一條記錄的合適結構是:

case class Record(year: Int, name: String, female: Boolean, count: Int)

讓我們轉換您的數據:

val data = CSV.fromFile("my_file.csv").map {
  case List(year, name, female, count) =>
    Record(year.toInt, name, female == "F", count.toInt)
}

如果您確實關心錯誤處理,則應在此處捕獲MatchError和NumberFormatException或嘗試檢測這些錯誤。

現在,我們可以以一種類型安全且簡潔的方式定義您的方法yearIs:

def yearIs(data: List[Record], year: Int) = data.filter(_.year == year)

您還可以直接創建從年份到記錄者列表的地圖:

val byYear: Map[Int, List[Record]] = data.record.groupBy(_.year)

我認為獲取“從n開始的年份列表”的最佳方法是使用filtern與年份或列表中的第一個元素進行比較。

scala> def yearIs(data: List[List[String]], n: Int): List[List[String]] = {
     | data.filter(xs => xs.head.toInt > n)
     | }
yearIs: (data: List[List[String]], n: Int)List[List[String]]

scala> yearIs(data, 1880)
res6: List[List[String]] = List()

scala> yearIs(data, 1879)
res7: List[List[String]] = List(List(1880, Mary, F, 7065), List(1880, Anna, F, 2604), List(1880, Emma, F, 2003))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM