CSV Parser


 

public class Solution {
  public static void main(String[] args) {
    System.out.println(parseCSV(
        "\"Kobe Bryant, 2020\",AAA, McDonald\"\"\"\"s, \"McDonald\"\"s\",\"\",asdf\"\"\"gh&$#^% \"\"sdfhjn,%$#^%\"\"\""));
    System.out.println(parseCSV(
        "\"Kobe Bryant, 2020\",AAA, McDonald\"\"\"\"s, \"McDonald\"\"s\",\"\",asdf\"\"\"gh&$#^% \"\"sdfhjn,%$#^%\"\"\""));
    System.out.println(parseCSV(
        "\"Kobe Bryant, 2020\",AAA, McDonald\"\"\"\"s, \"McDonald\"\"s\",\"\",asdf\"\"\"gh&$#^% \"\"sdfhjn,%$#^%\"\"\""));
  }

  public static String parseCSV(String str) {
    List<String> list = new ArrayList<>();

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); ++i) {
      char c = str.charAt(i);
      if (c == '"') {
        Object[] ret = consumeCharsWithinQuotes(str, i + 1);
        String withinQuotes = (String) ret[0];
        i = (Integer) ret[1]; //returned position points to the ending quote
        sb.append(withinQuotes);
      } else if (c == ',') {
        list.add(sb.toString());
        sb.setLength(0);
      } else {
        sb.append(c);
      }
    }
    //add the last item to list
    list.add(sb.toString());
    return String.join(" | ", list);
  }

  private static Object[] consumeCharsWithinQuotes(String str, int start) {
    StringBuilder sb = new StringBuilder();
    for (int i = start; i < str.length(); ++i) {
      char c = str.charAt(i);
      if (c == '"') {
        if (i == str.length() - 1) {
          //this is the ending quote
          return new Object[]{sb.toString(), i};
        }
        char nextChar = str.charAt(i + 1);
        if (nextChar == '"') {
          //this is an escaped quote
          sb.append('"');
          ++i;
        } else {
          //this is an internal ending quote
          return new Object[]{sb.toString(), i};
        }
      } else {
        sb.append(c);
      }
    }

    return null;
  }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM