Java CSVReader跳过行和&如何转换csv

时间:2016-12-13 14:41:19

标签: java eclipse csv reader

我一整天都在研究。而且我编码的方式并不重要,结果不是我想要的结果。

首先,我正在使用大数据,因此,我不认为保留复制和粘贴行条目是有效的。 我正在阅读一个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)

不是我的代码,不知道如何链接事物。主要问题:

  • 我怎样才能确保打印标题(有效方式,我不想复制/粘贴代码)?
  • 但是,我怎样才能使Reader也垂直写一些标题(转换)?

更新: enter image description here

包含数百行数据: - 测量值等于null - 测量等于整数或双精度(?) enter image description here

应该发生的事情是: - 当时,T和Z必须去。 - T应该是一个空格:&#34; &#34;和Z只是&#34;&#34; - 列B和更高的第1行应该只包含植物名称。

最终,应该能够以一种清晰的格式将这一切都放在MySQL数据库中,以便可以在Java Server Faces(类?)中使用D3.js折线图实现

4 个答案:

答案 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);

                }


            }
        }
    }}

仍然没有足够的效率,但做的工作......