Java: Detect the delimiter of a csv or txt file [duplicate]

*爱你&永不变心* 提交于 2021-02-08 08:29:19

问题


I saw that this question was already asked several times but they're on other language and I can't get a grasp on the answers.

I am receiving a .csv or .txt file through a socket. Is there any way I can detect the delimiter or "splitter" of a line in the CSV or TXT file?

This is the server code that handles the file writing,

try{
final ServerSocket server = new ServerSocket(8998);
socket = server.accept();
File sdcard = Environment.getExternalStorageDirectory();
File myFile = new File(sdcard,"TestReceived"+curDate+".csv");

final BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
final PrintWriter pw = new PrintWriter(new FileWriter(myFile));

 String line;
 String[] wordsarray;

 int bc = 0;
 int dc = 0;
 int pq = 0;
 int rq = 0;
 int id = 0;

 line = br.readLine();
 wordsarray = line.split(",");

 for (int x = 0; x<wordsarray.length; x++){

 switch(wordsarray[x]){
      case "COLUMN NAME A": id = x;
      break;
      case "COLUMN NAME B": bc = x;
      break;
      case "COLUMN NAME C": dc = x;
      break;
      case "COLUMN NAME D": pq = x;
      break;
      case "COLUMN NAME E": rq = x; 
      break;
      }              
  }
         pw.println(wordsarray[dc]+"\t"+wordsarray[rq]+"\t"+wordsarray[pq]+"\t"+wordsarray[bc]+"\t"+wordsarray[id]);


         for (line = br.readLine(); line != null; line = br.readLine()) {
                wordsarray = line.split(",");
                pw.println(wordsarray[dc]+"\t"+wordsarray[rq]+"\t"+wordsarray[pq]+"\t"+wordsarray[bc]+"\t"+wordsarray[id]);


                        }
              pw.flush();
              pw.close();
              br.close();
              socket.close();
              server.close();

}
catch (Exception e){
e.printStackTrace();
 }

If I put a comma on line.split(); and the file has a different delimiter, it produces repeated lines and I don't even know why is that happening

COLUMN NAME A COLUMN NAME B COLUMN NAME C COLUMN NAME D COLUMN NAME E COLUMN NAME A COLUMN NAME B COLUMN NAME C COLUMN NAME D COLUMN NAME E COLUMN NAME A COLUMN NAME B COLUMN NAME C COLUMN NAME D COLUMN NAME E COLUMN NAME A COLUMN NAME B COLUMN NAME C COLUMN NAME D COLUMN NAME E COLUMN NAME A COLUMN NAME B COLUMN NAME C COLUMN NAME D COLUMN NAME E COLUMN NAME A COLUMN NAME B COLUMN NAME C COLUMN NAME D COLUMN NAME E

But If the file has a matching delimiter of comma it produces just the right output.

 COLUMN NAME A COLUMN NAME B COLUMN NAME C COLUMN NAME D COLUMN NAME E

Is there any way I can automatically detect the delimiter of a file so I won't have to worry which delimiter the file is using? Or is there a better solution for it?


回答1:


Use a BufferedReader, place a mark(...), read the first line. If that line contains a \t tab character, then your file is tab-separated, otherwise assume that it is comma-separated.

Then parse the file using a CSV/TSV parser, e.g. Apache Commons CSV.

try (BufferedReader in = Files.newBufferedReader​(Paths.get(filename))) {
    in.mark(1024);
    String line = in.readLine();
    if (line == null)
        throw new IOException("File is empty: " + filename);
    CSVFormat fileFormat = (line.indexOf('\t') != -1 ? CSVFormat.TDF
                                                     : CSVFormat.RFC4180)
            .withHeader();
    in.reset();

    for (CSVRecord record : fileFormat.parse(in)) {
        String lastName = record.get("Last Name");
        String firstName = record.get("First Name");
        ...
    }
}


来源:https://stackoverflow.com/questions/58143808/java-detect-the-delimiter-of-a-csv-or-txt-file

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