Read and Write CSV File using Java

落爺英雄遲暮 提交于 2021-02-20 05:14:33

问题


I have a CSV log file and it contains many rows like this:

2016-06-21 12:00:00,000 : helloworld: header1=2;header2=6;header=0

I want to write them to a new CSV file.

public void readLogFile() throws Exception
{
    String currentLine = "";
    String nextLine = "";

    BufferedReader reader = new BufferedReader(new FileReader(file(false)));
    while ((currentLine = reader.readLine()) != null)
    {
        if (currentLine.contains("2016") == true)
        {
            nextLine = reader.readLine();
            if (nextLine.contains("helloworld") == true)
            {                   
                currentLine = currentLine.substring(0, 23);
                nextLine = nextLine.substring(22, nextLine.length());

                String nextBlock = replaceAll(nextLine);
                System.out.println(currentLine + " : helloworld: " + nextBlock);

                String[] data = nextBlock.split(";");
                for (int i = 0, max = data.length; i < max; i++)
                {
                    String[] d = data[i].split("=");
                    map.put(d[0], d[1]);
                }
            }
        }
    }
    reader.close();
}

This is my method to write the content:

public void writeContentToCsv() throws Exception
{
    FileWriter writer = new FileWriter(".../file_new.csv");
    for (Map.Entry<String, String> entry : map.entrySet())
    {
        writer.append(entry.getKey()).append(";").append(entry.getValue()).append(System.getProperty("line.separator"));
    }
    writer.close();
}

This is the output I want to have:

header1; header2; header3
2;6;0
1;5;1
5;8;8
...

Currently, the CSV file looks like this (only showing one dataset):

header1;4
header2;0
header3;0

Can anyone help me fix the code?


回答1:


Create a class to store the header values, and store it in the list. Iterate over the list to save the results.

The currently used map can only store 2 values (which it is storing the header value (name its corresponding value)

map.put(d[0], d[1]); here d[0] will be header1 and d[1] will be 4 (but we want only 4 from here)

    class Headervalues {
    String[] header = new String[3];
}

public void readLogFile() throws Exception
{
    List<HeaderValues> list = new ArrayList<>();
    String currentLine = "";
    BufferedReader reader = new BufferedReader(new FileReader(file(false)));
    while ((currentLine = reader.readLine()) != null)
    {
        if (currentLine.contains("2016") && currentLine.contains("helloworld"))
        {

                String nextBlock = replaceAll(currentLine.substring(22, currentLine.length());

                String[] data = nextBlock.split(";");
                HeaderValues headerValues = new HeaderValues();
                //Assuming data.length will always be 3.
                for (int i = 0, max = data.length; i < max; i++)
                {
                    String[] d = data[i].split("=");
                    //Assuming split will always have size 2
                   headerValues.header[i] = d[1];
                }
                list.add(headerValues)
            }
        }
    }
    reader.close();
}
public void writeContentToCsv() throws Exception
{
    FileWriter writer = new FileWriter(".../file_new.csv");
    for (HeaderValues value : headerValues)
    {
        writer.append(value.header[0]).append(";").append(value.header[1]).append(";").append(value.header[2]);
    }
    writer.close();
}



回答2:


For writing to CSV

public void writeCSV() {

        // Delimiter used in CSV file
        private static final String NEW_LINE_SEPARATOR = "\n";

        // CSV file header
        private static final Object[] FILE_HEADER = { "Empoyee Name","Empoyee Code", "In Time", "Out Time", "Duration", "Is Working Day" };

        String fileName = "fileName.csv");
        List<Objects> objects = new ArrayList<Objects>();
        FileWriter fileWriter = null;
        CSVPrinter csvFilePrinter = null;

        // Create the CSVFormat object with "\n" as a record delimiter
        CSVFormat csvFileFormat = CSVFormat.DEFAULT.withRecordSeparator(NEW_LINE_SEPARATOR);

        try {
            fileWriter = new FileWriter(fileName);

            csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat);

            csvFilePrinter.printRecord(FILE_HEADER);

            // Write a new student object list to the CSV file
            for (Object object : objects) {
                List<String> record = new ArrayList<String>();

                record.add(object.getValue1().toString());
                record.add(object.getValue2().toString());
                record.add(object.getValue3().toString());

                csvFilePrinter.printRecord(record);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fileWriter.flush();
                fileWriter.close();
                csvFilePrinter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



回答3:


Read and write/append CSV file using org.apache.commons.csv.CSVParser.

public void appendCSV(){
        String [] records = {};
        String csvWrite= "";
        Boolean status = false;

        try(BufferedReader csvReaders = new BufferedReader(new FileReader("csvfile.csv"));
                CSVParser parser = CSVFormat.DEFAULT.withDelimiter(',').withHeader().parse(csvReaders);
                ) {

            for(CSVRecord record : parser) {
                status= record.get("Microservice").equalsIgnoreCase(apipath);
                int status_code=0;
                String httpMethod = record.get("Method");

                if(status==true) {
                csvWrite = record.get("apiName")+"-"+record.get("Microservice")+"-"+record.get("R_Data")+"-"+record.get("Method")+"-"+record.get("A_Status")+"-"+400+"-"+record.get("A_Response")+"-"+"{}";
                    records = csvWrite.split("-");
                    CSVWriter writer = new CSVWriter(new FileWriter(pathTowritecsv,true));
                    writer.writeNext(records);
                    writer.close();

                }else {

                }
            }
        } 

        catch (Exception e) {
            System.out.println(e);
        }

}



来源:https://stackoverflow.com/questions/37941909/read-and-write-csv-file-using-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!