我一整天都在研究。而且我编码的方式并不重要,结果不是我想要的结果。
首先,我正在使用大数据,因此,我不认为保留复制和粘贴行条目是有效的。 我正在阅读一个CSV文件,它正在工作,它正在削减我告诉它切断的所有内容。到目前为止一切都很好。现在,唯一出错的是,(我的观点)Eclipse(Java)从csv文件中删除了头文件/列名。如何解决这个问题?
package data;
import java.io.FileReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import com.opencsv.CSVReader;
public class BelgiumParser {
public static void main(String[] args) {
// TODO Auto-generated method stub
//List<String> listBelgium;
String fileName = "src\\data\\Belgium.csv";
try{
List<String> listBelgium = Files.readAllLines(Paths.get(fileName));
//CSVReader reader = new CSVReader(new FileReader("src\\data\\Belgium.csv"), ',', '"', 1);
for(String line : listBelgium){
line = line.replace("\"" , "");
line = line.replaceAll("T", " ");
line = line.replaceAll("Z", "");
System.out.println(line);
}}catch(Exception e){
//System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
还尝试了while循环:
while(line = bufferedReader.readLine()) != null){...}
是的我尝试了bufferedReader和CSVReader。我甚至可能找到了Python解决方案吗?
headers = next(reader, None) # returns the headers or `None` if the input is empty
if headers:
writer.writerow(headers)
不是我的代码,不知道如何链接事物。主要问题:
包含数百行数据: - 测量值等于null - 测量等于整数或双精度(?)
应该发生的事情是: - 当时,T和Z必须去。 - T应该是一个空格:&#34; &#34;和Z只是&#34;&#34; - 列B和更高的第1行应该只包含植物名称。
最终,应该能够以一种清晰的格式将这一切都放在MySQL数据库中,以便可以在Java Server Faces(类?)中使用D3.js折线图实现
答案 0 :(得分:2)
如果您正在处理大数据,那么我建议您获取univocity-parsers因为它比其他任何东西都要快得多。然后尝试不加载内存中的所有行,因为这是一个明显的问题,而是流式传输它们。这是一个让你入门的简单例子:
CsvParserSettings settings = new CsvParserSettings();
settings.detectFormatAutomatically(); //you can configure the format manually if you prefer.
parserSettings.setHeaderExtractionEnabled(true); //you want to get the headers from the input
settings.selectFields("a", "b", "c"); //select just the columns you need.
CsvParser parser = new CsvParser(settings);
File input = Paths.get(fileName).toFile();
parser.beginParsing(input, "UTF-8");
String[] row;
while ((row = parser.parseNext()) != null) {
//do your stuff here.
//here are your headers
String[] headers = parser.getContext().parsedHeaders();
}
第二个问题,如果我理解正确的话,就是你要转置行,即将列的所有数据都与标题相关联。
为此,使用ColumnProcessor
(这将加载内存中的所有数据,稍后我将向您展示替代方案):
ColumnProcessor columnProcessor = new ColumnProcessor();
parserSettings.setProcessor(columnProcessor);
CsvParser parser = new CsvParser(parserSettings);
parser.parse(input, "UTF-8"); //all rows are submitted to the processor created above.
//At the end of the process, you can get your data like this:
Map<String, List<String>> columnValues = new TreeMap<String, List<String>>(columnProcessor.getColumnValuesAsMapOfNames());
如果您有太多数据,则需要批量执行转置操作。请使用BatchedColumnProcessor
:
BatchedColumnProcessor columnProcessor = new BatchedColumnProcessor(20000 /*runs batches of 20000 rows each*/) {
@Override
public void batchProcessed(int rowsInThisBatch) {
Map<Integer, List<String>> columnsByIndex = getColumnValuesAsMapOfIndexes();
//process your batch here
}
};
这应该完美。希望它有所帮助。
免责声明:我是这个库的作者,它是开源的,免费的(Apache V2.0许可证)
答案 1 :(得分:1)
CSVReader reader = new CSVReader(new FileReader("src\\data\\Belgium.csv"), ',', '"', 1);
上面代码中的最后一个参数,您要求CSVReader在读取文件时跳过line1。而是使用默认值(零),以便它也读取标题。
CSVReader reader = new CSVReader(new FileReader("src\\data\\Belgium.csv"), ',', '"', CSVReader.DEFAULT_SKIP_LINES);
关于第二个问题,您必须通过将行读入维护顺序的数组或列表来编写自定义逻辑,并使用增量索引处理写入。
答案 2 :(得分:0)
可能这样做的最好方法是基本上让它读取列的每个值,然后将其存储到数组中。然后将其写入一个新的转换后的CSV文件,该文件将按照您想要的任何顺序将整个数组打印在一行中。
我真的不能给你一些伪代码,因为我并不完全熟悉任何CSV阅读器库,但通常很容易找到并使用Javadoc来实现它
答案 3 :(得分:0)
终于实现了我想做的事情:
package code;
import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BelgiumParser {
public static void main(String[] args) throws IOException {
String fileName = "src/data/Belgium.csv";
try (CSVReader reader = new CSVReader(new FileReader(fileName), ',', '"', 1)) {
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
for (String line : nextLine) {
line = line.replaceAll("T", " ");
line = line.replaceAll("Z", "");
line = line.replaceAll("ActualGenerationPerUnit.mean", "");
line = line.replaceAll("Plantname:", "");
//Escaping curly braces is a must!
line = line.replaceAll("\\{", "");
line = line.replaceAll("\\}", "");
System.out.println(line);
}
}
}
}}
仍然没有足够的效率,但做的工作......