Java - 将文本拆分为数组而没有明显的分隔符

sam*_*sam 3 java regex arrays split

我需要使用循环将每行文本拆分为一个数组.问题是,鉴于文本文件的格式(我无法更改),没有明显的分隔符可供使用:

Adam Rippon      New York, NY    77.58144.6163.6780.94
Brandon Mroz     Broadmoor, CO   70.57138.1266.8471.28
Stephen Carriere Boston, MA      64.42138.8368.2770.56
Grant Hochstein  New York, NY    64.62133.8867.4468.44
Keegan Messing   Alaska, AK      61.15136.3071.0266.28
Timothy Dolensky Atlanta, AL     61.76123.0861.3063.78
Max Aaron        Broadmoor, CO   86.95173.4979.4893.51
Jeremy Abbott    Detroit, MI     99.86174.4193.4280.99
Jason Brown      Skokie Value,IL 87.47182.6193.3489.27
Joshua Farris    Broadmoor, CO   78.37169.6987.1783.52
Richard Dornbush All Year, CA    92.04144.3465.8278.52
Douglas Razzano  Coyotes, AZ     75.18157.2580.6976.56
Ross Miner       Boston, MA      71.94152.8772.5380.34
Sean Rabbit      Glacier, CA     60.58122.7656.9066.86
Lukas Kaugars    Broadmoor, CO   64.57114.7550.4766.28
Philip Warren    All Year, CA    55.80113.2457.0258.22
Daniel Raad      Southwest FL    52.98108.0358.6151.42
Scott Dyer       Brooklyn, OH    55.78100.9744.3357.64
Robert PrzepioskiRochester, NY   47.00100.3449.2651.08
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望每个名称都在[0](或[1]中的[0]姓氏中的名字),每个位置在[2]中,或者在两个不同的城市和州的索引中,然后每个得分在他们自己的索引中.每个人有四个单独的数字.例如Adam Rippon的得分是77.58,144.61,63.67,80.94

我不能用空格分割,因为有些城市的名字之间有一个空格(比如纽约将在两个不同的数组元素中分成New和York,而Broadmoor则在一个元素中).无法用逗号分割城市,因为西南FL没有逗号.我也不能用小数点分割数字,因为这些数字是错误的.那么有一个简单的方法可以做到这一点吗?也许是一种通过小数位数分割数字的方法?

kev*_*dez 7

看起来每列的大小都是固定的.因此,在您的情况下,第1列长度为17个字符,第二列长度为16个字符,最后一列长度为21个字符.

现在,您可以简单地遍历这些行并使用该substring()方法.就像是...

String firstColumn = line.substring(0, 17).trim();
String secondColumn = line.substring(17, 33).trim();
String thirdColumn = line.substring(33, line.length).trim();
Run Code Online (Sandbox Code Playgroud)

要提取数字,我们可以使用正则表达式搜索具有两个小数位的所有数字.

Pattern pattern = Pattern.compile("(\\d+\\.[0-9]{2})");

Matcher matcher = pattern.matcher(thirdColumn);

while(matcher.find())
{
    System.out.println(matcher.group());
}
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下47.00100.3449.2651.08会输出

47.00
100.34
49.26
51.08
Run Code Online (Sandbox Code Playgroud)