[英]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開始的年份列表”的最佳方法是使用filter
將n
與年份或列表中的第一個元素進行比較。
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.