gpt4 book ai didi

java - 字符串标记化的问题

转载 作者:行者123 更新时间:2023-12-01 18:17:50 25 4
gpt4 key购买 nike

我需要从包含至少 100K 记录的 PSV 文件中读取数据并将每一行映射到 DTO 对象。

例如我有一个管道分隔的字符串 SampleData|1111|9130|23||1257|2014-04-01 18:00:00|2014-04-12 09:00:00||软件开发人员|20|Vikas| |PATIL将根据 DTO 值解析并提取每个标记。

我从 String Tokenizer 开始,它给了我正确的结果,直到我收到上面的字符串作为输入。

该字符串的特殊之处在于它在几个管道之间没有任何字符,例如|23||1257|Vikas||PATIL

当我尝试使用标记器拆分它时,它给出的标记比我预期的要少。它只是忽略了空字符,结果是我将 1257 值分配给了phoneNumber,将InsertDaate 值分配给了regionCode。

我应该分配值,比如将 exampleData 分配给 dto 字段 dataType ,将 1111 分配给 recordID .. 并将 '' 分配给 phone Number 因为输入数据没有数据电话号码,但在23标记器将下一个标记读取为1257,所以我为phonenumber分配了错误的值1257 字段。

谢天谢地,我只在测试环境中意识到了这个错误。

我尝试了几个选项,最终用 String.split() 方法解决了这个问题。

import java.util.StringTokenizer;

public class TestSpitingOfString {
public static void main(String args[]) throws Exception {
//DTO dataType|recordID|employeeid|deptID|phoneNumber|regionCode|InsertDate|StartDate|hobby|designation|age|firstName|middleName|lastName
String str = "SampleData|1111|9130|23||1257|2014-04-01 18:00:00|2014-04-12 09:00:00||Software Developer|20|Vikas||PATIL";

System.out.println("Original String -> "+str);

StringTokenizer tokenizer= new StringTokenizer(str,"|");// skips empty values between tokens
System.out.println("Words With StringTokenizer ");
while(tokenizer.hasMoreElements()){
System.out.print(tokenizer.nextToken()+",");
}
System.out.println();

String distributedWithPipe[] =str.split("|");// disaster :( it splitted every character
System.out.println("Words With String.split() distributedWithPipe character ->");
for(String split : distributedWithPipe){
System.out.print(split+",");
}

System.out.println();
String distributedWithEscapedPipe[] =str.split("\\|"); // This worked for me
System.out.println("Words With String.split() distributedWithEscapedPipe ->");
for(String split : distributedWithEscapedPipe){
System.out.print(split+",");
}

}
}

当我运行这个时,我得到输出(我在每个标记之间保留 , 只是为了理解目的):

Original String -> SampleData|1111|9130|23||1257|2014-04-01 18:00:00|2014-04-12 09:00:00||Software Developer|20|Vikas||PATIL

Words With StringTokenizer

SampleData,1111,9130,23,1257,2014-04-01 18:00:00,2014-04-12 09:00:00,Software Developer,20,Vikas,PATIL,

Words With String.split() distributedWithPipe character ->

,S,a,m,p,l,e,D,a,t,a,|,1,1,1,1,|,9,1,3,0,|,2,3,|,|,1,2,5,7,|,2,0,1,4,-,0,4,-,0,1, ,1,8,:,0,0,:,0,0,|,2,0,1,4,-,0,4,-,1,2, ,0,9,:,0,0,:,0,0,|,|,S,o,f,t,w,a,r,e, ,D,e,v,e,l,o,p,e,r,|,2,0,|,V,i,k,a,s,|,|,P,A,T,I,L,

Words With String.split() distributedWithEscapedPipe ->

SampleData,1111,9130,23,,1257,2014-04-01 18:00:00,2014-04-12 09:00:00,,Software Developer,20,Vikas,,PATIL,

我为什么问这个问题:

  1. 如果有人知道如何使用 StringTokenizer 来解决这个问题,我很乐意学习。否则我们可以说这是 StringTokenizer 的限制。
  2. 如果有人遇到同样的问题,则可以使用替代解决方案,无需浪费时间寻找解决方案。
  3. 还要强调的是,由于习惯了 StringTokenizer,我们可能倾向于使用“|” Pipe(不带转义字符)作为分隔符和 String.split() 将不会产生预期的输出。

最佳答案

StringTokenizer在其 javadoc 中说明了这种行为(尽管我承认它可能更清楚,取决于您如何解释“连续字符”):

An instance of StringTokenizer behaves in one of two ways, depending on whether it was created with the returnDelims flag having the value true or false:

  • If the flag is false, delimiter characters serve to separate tokens. A token is a maximal sequence of consecutive characters that are not delimiters.

  • If the flag is true, delimiter characters are themselves considered to be tokens. A token is thus either one delimiter character, or a maximal sequence of consecutive characters that are not delimiters.

阅读this bug in JDK Bug Database的评论(或this one):

StringTokenizer defines a token to be a maximal sequence of consecutive characters that are not delimiters. Thus there are no tokens in substring ",,".

然后您可以使用构造函数 StringTokenizer(String str, String delim, true)但请注意,这将返回分隔符作为每个标记的一部分,因此您需要自己删除它们,这是一个很大的负担。

出于所有这些原因,最好只使用 String.split

关于java - 字符串标记化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28630950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com