在Java的CSV字段值中包含逗号(以逗号为单位的逗号)

时间:2018-08-14 09:04:32

标签: java string csv delimiter core

我想创建一个以逗号分隔定界符的csv文件,而读取csv时会以逗号分隔形式使s5字符串。希望将s5字符串保留在单列中。

   String s1="quick";
   String s2="brown";
   String s3="fox";
   String s4="jump";
   String s5="over,the,lazy,dog";


  String csvRecord = String.format("%s,%s,%s,%s,%s", s1,s2,s3,s4,s5);

任何人都可以帮助我,因为我是字符串的新手。

4 个答案:

答案 0 :(得分:1)

我认为您需要将它们添加到双字符串中。

尝试一下:

String s5="\"over,the,lazy,dog\"";

答案 1 :(得分:0)

要在数据中包含定界符,必须在结果csv中用双引号将该字段引起来:

quick,brown,fox,jump,"over,the,lazy,dog"

如果某些字段中有双引号,则必须将其转义:

123,"24"" monitor, Samsung",456  // Windows style
123,"24\" monitor",456           // Linux style

您不必引用所有字段,只需引用包含定界符或双引号(或换行符)的字段即可。

有关csv通用格式的更多详细信息,请参见RFC4180

答案 2 :(得分:0)

就像其他答案一样,您实际上必须考虑许多特殊情况,最典型的两种特殊情况是:逗号和双引号。

如Chewtoy所述,CSV wiki已将格式明确指定为:

enter image description here

import firebase from 'firebase/app'
import 'firebase/auth'

export default{
    state: {
        user: null
    },
    mutations: {
        setUser (state, payload) {
      state.user = payload
        }       
  },
    actions: {
        authCheck({ commit }) {
            commit('setLoading', true)
            firebase.auth().onAuthStateChanged((user) => {              
                if(user){
                    commit('setUser', {
                        id: user.uid,
                        name: user.displayName,
                        email: user.email
                    })
                    commit('setLoading', false)
                }
            })
        },      
        logout({commit}) {
            firebase.auth().signOut()
            commit('setUser', null)
        }
    },
    getters: {
        user (state) {
            return state.user
        }
    }
}

要处理这两种情况,您可以尝试以下操作:

Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00

输出:

public class CsvAddComma {
    public static void main(String... args) {
        List<String> list = new ArrayList<>();
        list.add("quick");
        list.add("over,the,lazy,dog");
        list.add("Venture \"Extended Edition, Very Large\"");
        list.stream()
                .map(s -> convertToCsvFormat(s))
                .forEach(System.out::println);
    }

    private static String convertToCsvFormat(String input) {
        if (input.contains("\"")) {
            input = input.replaceAll("\"", "\"\"");
        }
        if (input.contains(",")) {
            input = String.format("\"%s\"", input);
        }
        return input;
    }
}

对于其他特殊情况,您需要根据当前情况进行处理。也许可以忽略不计。

答案 3 :(得分:0)

除非您要进行一些分配工作,否则您绝对需要一个CSV库来为您处理。您还需要关心值中的行尾和其他引号,而不仅仅是分隔符

使用univocity-parsers尝试以下代码:

CsvWriterSettings settings = new CsvWriterSettings();
CsvWriter writer = new CsvWriter(settings);
String result = writer.writeRowToString(s1,s2,s3,s4,s5);

希望这会有所帮助。

免责声明:我是这个图书馆的作者。它是开源且免费的(Apache 2.0许可证)