2014-09-25 125 views
1

我有许多字符串,它们的大小非常随机,如下所示:5个字符随机为12000。Java将字符串拆分成数组,按大小分割,只在分隔符之后拆分

如:

String 1 : A,b,C,d 
String 2 :23,343,342,4535,4535,453,234, 
String 3 : ,asdsfdfdasgfdsfsf,dsfdsfdsfdsfsdfdf,sdsfdsfdsfsdf, <- and this around another 1000 times. 

我想通过自己的ID给他们上传到我的数据库。所以我的问题是,oracle数据库varchar可以conatians只有4k字节。

编辑: 所以如果字符串大于4k。我想要一个String [],其中每个元素的最大值为4000k字符的字符数为3900.(和ofc如果我通过数组获取相同的字符串,并且每个数组元素的最后一个“字”是整个字未切片)

所以我的想法是,如果string.lenth < 1000然后去。其他人将它分割成4000只股票,但在昏迷之后才分裂。

我的解决方案至今(不伴昏迷的护理)

 for (My_type type: types) { 
     String[] tokens = 
       Iterables.toArray(
        Splitter 
         .fixedLength(4000) 
         .split(type.area), 
        String.class 
       ); 

我怎么能代替这个函数来得到一个“好阵”?

+0

你能解释一下吗? – blackSmith 2014-09-25 07:07:13

+0

只要检查一下:你的字面意思是“逗号后面” - 即你是否想在逗号结尾处保留逗号? – Bohemian 2014-09-25 07:48:59

回答

3

我不认为split()是一个选项。我认为你需要使用一个匹配器消耗尽可能多的输入地,然后建立捕获部分名单:

Matcher matcher = Pattern.compile(".{1,3999}(,|.$)").matcher(input); 
List<String> list = new ArrayList<>(); 
while (matcher.find()) 
    list.add(matcher.group()); 

如果你真的想要一个数组(不推荐)

String[] array = list.toArray(new String[list.size()]); 

此正则表达式是贪婪的,会消耗多达4000个以逗号或输入结束的字符。长度为3999用于允许1个逗号本身,并且在结束标记$之前的点将再消耗一个,因为$是零宽度。

+0

谢谢,我跳过阵列部分。列表对我有好处。谢谢你的建议。 – Csanesz 2014-09-25 10:53:41

2

这会给你这样的标记,在列表<> - 希望没关系。

for (My_type type: types) { 
    String longString = type.area; 
    List<String> tokens = new ArrayList<>(); 
    while (longString.length() > 4000) { 
     int splitIndex = longString.lastIndexOf(",", 3999); 
     if (splitIndex < 0) { 
      // no comma found 
      throw new IllegalStateException("Cannot split string"); 
     } 
     tokens.add(longString.substring(0, splitIndex)); 
     longString = longString.substring(splitIndex + 1); // leaving out the comma 
    } 
    if (tokens.size() == 0) { 
     tokens.add(longString); 
    } 
}