用csv填充

2024-04-26 18:41:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,或多或少是“半结构化的”

    rowNumber;ColumnA;ColumnB;ColumnC;
    1;START; b; c;
    2;;;;
    4;;;;
    6;END;;;
    7;START;q;x;
    10;;;;
    11;END;;;

现在,我想获取此行的数据-->;1;START;b;c;填充,直到在columnA中找到“END”。然后它应该取这一行-->;7;START;q;x;并用值填充下面的单元格,直到下一个“END”(这里:11;结束;;;)在

我是一个完全的初学者,这对我来说相当困难,我应该如何开始:

^{pr2}$

我开始用CSVReader读取文件并创建一个主列表。我创建了一个循环并迭代并将所有的起始值放入其中(这样我就知道从开始到下一个开始的范围)。 我创建了第二个循环,我想把数据集放到一个新的ListBuffer中。但这行不通

下一步是合并主列表+派生列表。在

我需要一些好主意,或者朝着正确的方向努力,我该怎么做或者怎样才能做得容易一点? 非常感谢帮助!!在

我不知道,如果有很大的区别,首先,我想创建一个apachespark应用程序。在Python中也可以选择这样做(如果更容易的话)

输出应如下所示: 它应该看起来像

    1;START; b; c;
    2;;b;c;
    4;;b;c;
    6;END;;;
    7;START;q;x;
    10;;q;x;
    11;END;;;

你永远不会有尽头。只需填写下面的行,从ColumnB和ColumnC开始


Tags: 文件csv数据gt列表startend结构化
3条回答

我推荐已经给出的问题/答案中的解决方案(使用库),这里有一个关于如何不这样做的答案:p

代码

val text = """rowNumber;ColumnA;ColumnB;ColumnC;
1;START; b; c;
2;;;;
4;;;;
6;END;;;
7;START;q;x;
10;;;;
11;END;;;"""

val groupsRe = """(?s)\S*?START.*?END\S*""".r
val valuesRe = """^.*?START;\s*(\S*);\s*(\S*);""".r

groupsRe.findAllIn(text)
  .map(_.split("\n"))
  .map({ lines =>
    lines.head match {
      case valuesRe(a, b) =>
        lines.map(_.replaceAll(";;;;", s";;$a;$b;"))
      case g =>
        println(s"Don't recognise $g")
        lines
    }
  }).map(_.mkString("\n"))
  .mkString("\n")

输出

^{pr2}$

有点功能性[1]。从readAll中删除(1),因为它也读取头。在结尾处也要删除(1),因为scanleft以start result开始。在

ScanLeft可以让你处理计算的前一个值,它接受一个有两个参数的函数,第一个是上一个计算的结果,第二个参数是列表的当前值(iterator..)。它需要一个sentinel类型的值作为列表的第一个元素,我在本例中提供了空列表。在

现在在我传递给scanleft(prev,curr)=>;的函数中。。。。 如果当前csv行的curr以“START”或“END”开头,则不需要执行任何预期值。另一方面,我们需要获取当前行的前两个值,并附加除前两列之外的前一行(即drop2)。你也可以附加prev(2)和prev(3)。在

最后还有一个drop(1),因为scan left返回带有sentinel的第一行,即start值,我们不需要它。在

val reader = new CSVReader(new FileReader("test.in"),';')
val start = List("","","","")
val res = reader.readAll.drop(1).scanLeft(start)((prev,curr) => {
  curr(1) match { 
    case "START" => curr.toList
    case "END" => curr.toList
    case _ => curr(0) ::  curr(1) :: (prev drop 2)
  }
}).drop(1)

查看结果

^{pr2}$

这将输出

List(1, START,  b,  c, )
List(2, ,  b,  c, )
List(4, ,  b,  c, )
List(6, END,  ,  , )
List(7, START, q, x, )
List(10, , q, x, )
List(11, END, , , )

[1]。Reduce, fold or scan (Left/Right)?

显然,您误用了stream的“readAll”函数。在

for (i <- i to startList.length ) {
  for(row <- masterList.readAll)
  if (row(0) > startList(i) && row(0) < startList(i+1)) {
    derivedList += row
  }
}

在第一个readAll函数之后,第二个函数无法读取任何内容,因为第一个readAll使流指针指向文件末尾,因此需要重置strampoint。在

相关问题 更多 >