我有很多字符串,它们的大小非常随机:5个字符到12000个随机字符。
例如:
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只能占用4k字节。
修改 所以如果字符串大于4k。我想要一个String [],其中每个元素最多4000k字符允许计数3900.(并且如果我通过数组我得到相同的字符串,并且每个数组元素最后&#34;字&#34;是一个完整的单词不是切片)
所以我的想法是,如果string.lenth&lt; 1000然后去。 否则将它分成~4000只股票,但只能在昏迷后分开。
到目前为止我的解决方案(没有昏迷关怀)
for (My_type type: types) {
String[] tokens =
Iterables.toArray(
Splitter
.fixedLength(4000)
.split(type.area),
String.class
);
如何更换此功能以获得&#34;良好的数组&#34;?
答案 0 :(得分:3)
我不认为split()
是一种选择。我认为您需要使用Matcher来尽可能多地使用输入,然后构建捕获的部分列表:
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个以上,并且结束标记$之前的点将消耗一个,因为$是零宽度。
答案 1 :(得分:2)
这将在List&lt;&gt;中为您提供此类令牌 - 希望那很好。
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);
}
}