读取csv文件并分离键和值,然后返回java中的映射

读取csv文件并分离键和值,然后返回java中的映射,java,string,csv,split,Java,String,Csv,Split,我正在读取一个csv文件,该文件有一列,其中一列中包含一个键值对。csv文件中的示例: Country Product Baseurl ParamAndMacro USA Oil http://usa.com key={value}&key2={value2}&key3={value3} 我正在尝试拆分名为ParamAndMacro的列,并按键值对将其存储在hashMap中。 我的第一次尝试是使用spl

我正在读取一个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;
}
**注:**我从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=}
key={value}&key2={value2}
不是CSV格式。逗号在哪里?预期的输出是什么?@JacekCz更新了问题。很抱歉,忘记了包含CSV文件的详细信息。我能够读取文件的内容,但我必须拆分ParamAndMacro以生成带有参数的url。@YCF\L显示了输出,我会尝试让您知道我现在有点累:)
key={value}&key2={value2}
不是CSV格式。逗号在哪里?预期的输出是什么?@JacekCz更新了问题。很抱歉,忘记了包含CSV文件的详细信息。我能够读取文件的内容,但我必须拆分ParamAndMacro以生成带有参数的url。@YCF\L显示了输出,我会尝试让您知道我现在有点累:)
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;
}