我实际上需要在 pgAdmin 数据库中为货币导入 csv 文件。我的文件如下;
我的代码如下,使用ISO-8859-1格式。
File fileDir = new File(fileName);
FileInputStream fis= new FileInputStream(fileDir);
InputStreamReader isr= new InputStreamReader(fis, "ISO-8859-1");
BufferedReader br = new BufferedReader(isr);
String line;
line = br.readLine();
String[] arrayHeader = line.split(";");
size = arrayHeader.length;
if(size==expectedSize){
//check header
String header[] = {"Currency_ISO", "Currency_Label", "Currency_Symbol"};
for(int i=0;i<header.length;i++){
if(arrayHeader[i].trim().equals(header[i])){
fileStatus = true;
sResult = "File Status: Valid <br/> ";
}
else{
fileStatus = false;
sResult = "File Status: Invalid <br/> ";
break;
}
}
}else{
fileStatus = false;
sResult = "File Status: Invalid <br/> ";
}
if(fileStatus){
while ((line = br.readLine()) != null) {
String[] arrayData = line.split(";", -1);
//create object
objCurrency = new clsCurrency();
if(arrayData[0] != "" && !arrayData[0].isEmpty() && arrayData[0].trim() != ""){
objCurrency.setsCurrencyIso(arrayData[0].trim());
}else{
objCurrency.setsCurrencyIso(null);
}
if(arrayData[1] != "" && !arrayData[1].isEmpty() && arrayData[1].trim() != ""){
objCurrency.setsCurrencyLabel(arrayData[1].trim());
}else{
objCurrency.setsCurrencyLabel(null);
}
if(arrayData[2] != "" && !arrayData[2].isEmpty() && arrayData[2].trim() != ""){
System.out.println("setsLocalCurrencySymbol: " + arrayData[2]);
objCurrency.setsCurrencySymbol(arrayData[2].trim());
}else{
objCurrency.setsCurrencySymbol(null);
}
lstCurrencyImported.add(objCurrency);
}//end while
如您所见,我有一个System.out.Println()
来检查符号的值。但主要问题是Symbol没有被正确读取。它返回?
。见下面的println;
[stdout] (default task-7) setsCurrencySymbol: ?
我尝试将格式更改为UTF-8
或UTF-16
,但徒劳无功。
我在网上看到Java有货币类,但问题是我需要直接从csv中读取它,而且我不认为用户知道每种货币的代码。
我知道如何从这里开始呢?
答案 0 :(得分:3)
如果CSV文件包含欧元符号,则该文件不可能是ISO-8859-1。 ISO-8859-1中不存在欧元符号。它已添加到ISO-8859-15。
首先,要了解CSV文件实际使用的编码方式。然后,配置Java @Autowired
private AppConfig config;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
contextSource = new LdapContextSource();
contextSource.setUrl(config.getProperty("LDAP_CONFIG_BASE_URL"));
contextSource.setAnonymousReadOnly(Boolean.parseBoolean(config.getProperty("LDAP_CONFIG_IS_ANONYMOUS")));
contextSource.afterPropertiesSet();
ldapTemplate = new LdapTemplate(contextSource);
// Do auth related stuff
}
以使用该编码。
答案 1 :(得分:1)
由于 Windows-1252 还包含比ISO-8859-15更多的字符,如引号等逗号,最好用它来正确阅读文本。
然后,文本在字符串中是正确的(以Unicode格式)。
替代方案,当用户的PC确定使用哪个字符集时,以及
软件在那里运行,你可以使用Charset.defaultCharset()
作为InputStreamReader的参数,或者根本不给出参数。
在控制台中显示字符串会再次涉及到默认操作系统字符集的转换。可能也是Windows中的Windows-1252,在美国。字符集不知道它将被转换为?,但它将存在于字符串中。
例如,您可以将其写入UTF-8文件。