Java – Schrijfsnaren naar een CSV-bestand

Ik probeer gegevens te schrijven naar een CSV-bestand met Java, maar wanneer ik het geproduceerde bestand opent met Excel, krijg ik een foutmelding: het bestand is corrupt. Bij het openen van het bestand in Kladblok lijkt het correct te worden geformatteerd, dus ik weet niet zeker wat het probleem is. Ik gebruik de class van FileWriter om de gegevens naar het bestand uit te voeren.

FileWriter writer = new FileWriter("test.csv");
writer.append("ID");
writer.append(',');
writer.append("name");
writer.append(',');
...
writer.append('\n');
writer.flush();
writer.close();

Moet ik wat bibliotheek in Java gebruiken om naar een CSV-bestand af te drukken? Ik veronderstelde dat je dit gewoon in Java zou kunnen doen zolang je de juiste opmaak hebt gebruikt.

Waardeer de hulp,

Shaw


1, Autoriteit 100%

In feite is het omdat MS Excel niet kan beslissen hoe u het bestand met dergelijke inhoud kunt openen.

Wanneer u IDals het eerste teken in een bestand van het spreadsheettype plaatst, past deze overeen met de specificatie van een Sylk -bestand en MS Excel (en potentieel andere spreadsheet-apps) proberen het te openen als een SYLK-bestand. Maar tegelijkertijd voldoet het niet aan de volledige specificatie van een Sylk-bestand sinds de rest van de waarden in het bestand worden door komma’s gescheiden. Vandaar dat de fout wordt getoond.

Om het probleem op te lossen, wijzigt u "ID"naar "ID"en het zou moeten werken zoals verwacht.

Dit is raar. Maar ja!

Probeer ook de toegang tot het minimaliseren van het bestandsobject minder te minimaliseren.

Ik heb getest en de onderstaande code werkt perfect.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class CsvWriter {
  public static void main(String[] args) {
    try (PrintWriter writer = new PrintWriter(new File("test.csv"))) {
      StringBuilder sb = new StringBuilder();
      sb.append("id,");
      sb.append(',');
      sb.append("Name");
      sb.append('\n');
      sb.append("1");
      sb.append(',');
      sb.append("Prashant Ghimire");
      sb.append('\n');
      writer.write(sb.toString());
      System.out.println("done!");
    } catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    }
  }
}

Antwoord 2, autoriteit 11%

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class CsvFile {
    public static void main(String[]args){
        PrintWriter pw = null;
        try {
            pw = new PrintWriter(new File("NewData.csv"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        StringBuilder builder = new StringBuilder();
        String columnNamesList = "Id,Name";
        // No need give the headers Like: id, Name on builder.append
        builder.append(columnNamesList +"\n");
        builder.append("1"+",");
        builder.append("Chola");
        builder.append('\n');
        pw.write(builder.toString());
        pw.close();
        System.out.println("done!");
    }
}

Antwoord 3, autoriteit 5%

Ik denk dat dit een eenvoudige code in Java is die de tekenreekswaarde in CSV laat zien nadat deze code is gecompileerd.

public class CsvWriter {
    public static void main(String args[]) {
        // File input path
        System.out.println("Starting....");
        File file = new File("/home/Desktop/test/output.csv");
        try {
            FileWriter output = new FileWriter(file);
            CSVWriter write = new CSVWriter(output);
            // Header column value
            String[] header = { "ID", "Name", "Address", "Phone Number" };
            write.writeNext(header);
            // Value
            String[] data1 = { "1", "First Name", "Address1", "12345" };
            write.writeNext(data1);
            String[] data2 = { "2", "Second Name", "Address2", "123456" };
            write.writeNext(data2);
            String[] data3 = { "3", "Third Name", "Address3", "1234567" };
            write.writeNext(data3);
            write.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        System.out.println("End.");
    }
}

Antwoord 4

private static final String FILE_HEADER ="meter_Number,latestDate";
    private static final String COMMA_DELIMITER = ",";
    private static final String NEW_LINE_SEPARATOR = "\n";
    static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:m m:ss");
    private void writeToCsv(Map<String, Date> meterMap) {
        try {
            Iterator<Map.Entry<String, Date>> iter = meterMap.entrySet().iterator();
            FileWriter fw = new FileWriter("smaple.csv");
            fw.append(FILE_HEADER.toString());
            fw.append(NEW_LINE_SEPARATOR);
            while (iter.hasNext()) {
                Map.Entry<String, Date> entry = iter.next();
                try {
                    fw.append(entry.getKey());
                    fw.append(COMMA_DELIMITER);
                    fw.append(formatter.format(entry.getValue()));
                    fw.append(NEW_LINE_SEPARATOR);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    iter.remove();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5

Ik zie dat je al een antwoord hebt, maar hier is een ander antwoord, misschien zelfs sneller
Een eenvoudige klasse om een ​​lijst met objecten door te geven en een CSV of Excel of Wachtwoord beveiligd ZIP CSV of Excel op te halen.
https://github.com/nernst223/spread-heet-exporter

SpreadSheetExporter spreadSheetExporter = new SpreadSheetExporter(List<Object>, "Filename");
File fileCSV = spreadSheetExporter.getCSV();

6

Generate CSV file from List of Objects
Finally, following is an example showing how to generate a CSV file from List of objects. The example uses the MyUser class defined in the previous section -
import com.opencsv.CSVWriter;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.opencsv.exceptions.CsvDataTypeMismatchException;
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class OpenCSVWriter {
    private static final String STRING_ARRAY_SAMPLE = "./example.csv";
    public static void main(String[] args) throws IOException,
            CsvDataTypeMismatchException,
            CsvRequiredFieldEmptyException {
        try ( Writer writer = Files.newBufferedWriter(Paths.get(STRING_ARRAY_SAMPLE));
        ) {
            StatefulBeanToCsv<MyUser> beanToCsv = new StatefulBeanToCsvBuilder(writer)
                    .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
                    .build();
            List<MyUser> myUsers = new ArrayList<>();
            myUsers.add(new MyUser("Sundar Pichai ♥", "[email protected]", "+1-1111111111", "India"));
            myUsers.add(new MyUser("Satya Nadella", "[email protected]", "+1-`enter code here`1111111112", "India"));
            beanToCsv.write(myUsers);
        }
    }
}

7

   String filepath="/tmp/employee.csv";
    FileWriter sw = new FileWriter(new File(filepath));
    CSVWriter writer = new CSVWriter(sw);
    writer.writeAll(allRows);
    String[] header= new String[]{"ErrorMessage"};
    writer.writeNext(header);
    List<String[]> errorData = new ArrayList<String[]>();
    for(int i=0;i<1;i++){
        String[] data = new String[]{"ErrorMessage"+i};
        errorData.add(data);
    }
    writer.writeAll(errorData);
    writer.close();

Other episodes