从csv文件中读取并分离键和值并在java中返回映射

时间:2017-09-10 10:00:53

标签: java string csv split

我从一个csv文件中读取,该文件的列中包含一列中的键值对。来自csv文件的示例:

Country    Product    Baseurl              ParamAndMacro
USA        Oil        http://usa.com      key={value}&key2={value2}&key3={value3}

我尝试拆分名为 ParamAndMacro 的列,并按密钥值对将其存储在hashMap中。 我的第一次尝试,我成功地使用split函数分割字符串:

public Map<String, String> splitString(String s) {
    // String s represents ParamAndMacro
    String[] split = s.split("=|\\&");
    int length = split.length;
    Map<String, String> maps = new HashMap<>();
    for (int i=0; i<length; i+=2){
          maps.put(split[i], split[i+1]);
     } 
    return maps;
}

这有效,但它不会检查角落情况。例如"key={value}&key2={value2}&key3=""key={value}&key2={value2}&key3=&",因为这将引发异常。基本上,如果值为空,则存储具有键和空值的对象。 例如:{key3=}。此外,如果缺少密钥,请不要将其存储在地图中,即使用记录器报告错误,跳过它并继续。到目前为止,我已尝试一次通过,但我没有检查是否缺少一个密钥。下面是我的实现,我的算法如何以及它是否有效。

所以我在下面实现了分割功能:

public Map<String, String> splitString(String s){
 Map<String, String> maps = new HashMap<>();
 int length = s.length();
 StringBuilder sb = new StringBuilder();
 String key = "";
 String value = "";

char prev = ' ';
for (int i=0; i<length; i++) {
    char a = s.charAt(i);
    if ( a != '=' && a != '&' && prev != a) {
           sb.append(a);        
      }

    else if( a == '=' && prev != a && prev != '&') {
          key = sb.toString();
          sb = new StringBuilder();
      }

    else if (a=='&' && prev != a && prev != '=') {
          value = sb.toString();
          sb = new StringBuilder();
          maps.put(key, value);
            }
    else if (prev=='=' && a == '&') {
          value = "";
          maps.put(key, value);
          sb = new StringBuilder();
    }
            prev = a;
    }
    return maps;
}

**注意:**我正在读取csv文件。参数和宏可能很长,也想知道我的算法在一次通过中是否有效。

预期产出

key={value}&key2={value2}&key3=&是:

输出: {key={value}, key2={value2}, key3=}

key={value}&key2={value2}&key3=是:

输出: {key={value}, key2={value2}, key3=}

key={value}&{value2}&key3=是:

输出: {key={value}, key3="}

={value}&key2={value2}&key3=是:

输出: {key2={value2}, key3=}

0 个答案:

没有答案