Parse .txt to .csv

19,607

Solution 1

This is very simple in Java 8:

public static void main(String[] args) throws Exception {
    final Path path = Paths.get("path", "to", "folder");
    final Path txt = path.resolve("myFile.txt");
    final Path csv = path.resolve("myFile.csv");
    try (
            final Stream<String> lines = Files.lines(txt);
            final PrintWriter pw = new PrintWriter(Files.newBufferedWriter(csv, StandardOpenOption.CREATE_NEW))) {
        lines.map((line) -> line.split("\\|")).
                map((line) -> Stream.of(line).collect(Collectors.joining(","))).
                forEach(pw::println);
    }
}

First you get your files at Path objects.
Then you open a PrintWriter to your destination Path.

Now you do some Java 8 stream processing with lambdas:

  • Files.lines(txt) streams the lines from the file
  • map((line) -> line.split("\\|")) splits each line to a String[] on |
  • map((line) -> Stream.of(line).collect(Collectors.joining(","))) joins the individual String[] again using ,
  • forEach(pw::println) writes the new lines to the destination file.

Using import static:

    try (
            final Stream<String> lines = Files.lines(txt);
            final PrintWriter pw = new PrintWriter(newBufferedWriter(csv, StandardOpenOption.CREATE_NEW))) {
        lines.map((line) -> line.split("\\|")).
                map((line) -> Stream.of(line).collect(joining(","))).
                forEach(pw::println);
    }

As Java 8 was released only yesterday here is a Java 7 solution:

public static void main(String[] args) throws Exception {
    final Path path = Paths.get("path", "to", "folder");
    final Path txt = path.resolve("myFile.txt");
    final Path csv = path.resolve("myFile.csv");
    final Charset utf8 = Charset.forName("UTF-8");
    try (
            final Scanner scanner = new Scanner(Files.newBufferedReader(txt, utf8));
            final PrintWriter pw = new PrintWriter(Files.newBufferedWriter(csv, utf8, StandardOpenOption.CREATE_NEW))) {
        while (scanner.hasNextLine()) {
            pw.println(scanner.nextLine().replace('|', ','));
        }
    }
}

Again, with import static:

    try (
            final Scanner scanner = new Scanner(newBufferedReader(txt, utf8));
            final PrintWriter pw = new PrintWriter(newBufferedWriter(csv, utf8, StandardOpenOption.CREATE_NEW))) {
        while (scanner.hasNextLine()) {
            pw.println(scanner.nextLine().replace('|', ','));
        }
    }

Solution 2

Yes it is very much possible. Replace | by , and write it to a csv

public class NewClass {

public static void main(String[] args) throws IOException {

   String data = "one|two|three|four"+"\n"+
           "one|two|three|four";
   //Use a BufferedReader to read from actual Text file
    String csv = data.replace("|", ",");
    System.out.println(csv);

    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("MyCSV.csv")));
    out.println(csv);
    out.close();
}
}

Output

run:
one,two,three,four
one,two,three,four
BUILD SUCCESSFUL (total time: 0 seconds)
Share:
19,607
user3333587
Author by

user3333587

Updated on August 06, 2022

Comments

  • user3333587
    user3333587 over 1 year

    Is it possible to create a Java program which recognizes the text in a .txt file and write it in a .csv file? If yes,how would you start with such a problem?

    My .txt file is Text1 |Text 2 so I could somehow get the char "|" and split it into two cells.

  • Boris the Spider
    Boris the Spider about 10 years
    Why on earth would you read the whole file into memory?! Streaming line by line would be a much more practical approach. And recommending a third party library when it is unnecessary because a) writing the code yourself is 3 lines and b) Java 8 already has this functionality.
  • Admin
    Admin about 10 years
    @BoristheSpider if the file happens to be small, I wouldn't consider the memory usage to be a big deal. This is the original poster's first Java program. It's probably just for practice.
  • Funky coder
    Funky coder about 10 years
    @BoristheSpider I generally try to encourage new programmers to use third party libraries so in the future they are not spending to much time on reinventing wheels. Good point about streaming, but as Cupcake noted it kinda depends on the size of the input.
  • Jonn
    Jonn about 10 years
    Hooray for Java Lambda Expressions!
  • Boris the Spider
    Boris the Spider about 10 years
    @Shashi in this case I think it worth creating a complete solution. All the other answers point to outdated APIs that the user should not be learning.
  • Boris the Spider
    Boris the Spider about 10 years
    While it is admirable to encourage new developers not to reinvent wheels, to do so at the expense of learning the Java API is anathema. Java 8 already has a joining collector: List.stream().collect(Collectors.joining(delim)).
  • Funky coder
    Funky coder about 10 years
    Yeah... but Java 8 was officially released yesterday :) But you are absolutely right, that if a given functionality exists in standard JDK we should use it first.
  • Bae Cheol Shin
    Bae Cheol Shin almost 8 years
    You may want to escape double quote(") and comma(,). For example, you split each row by |, and for each column we need to escape double quote and comma.
  • Shubham Arya
    Shubham Arya over 3 years
    How to escape comma that is part of our data?