我有一个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开始
我推荐已经给出的问题/答案中的解决方案(使用库),这里有一个关于如何不这样做的答案:p
代码
输出
^{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值,我们不需要它。在
查看结果
^{pr2}$这将输出
[1]。Reduce, fold or scan (Left/Right)?
显然,您误用了stream的“readAll”函数。在
在第一个readAll函数之后,第二个函数无法读取任何内容,因为第一个readAll使流指针指向文件末尾,因此需要重置strampoint。在
相关问题 更多 >
编程相关推荐