如何根据光标位置分割线条?

时间:2015-10-07 21:35:22

标签: java string parsing csv tokenize

我有一个文本文件,其中包含我需要的所有信息,这需要转换为.csv文件。

示例:

abbccccdeffffiiiiiiiiiiiiiijjkkkkkkkkkkkllmmmmmmnnooo
abbccccdeffffiiiiiiiiiiiiiijjkkkkkkkkkkkllmmmmmmnnooo
abbccccdeffffiiiiiiiiiiiiiijjkkkkkkkkkkkllmmmmmmnnooo
abbccccdeffffiiiiiiiiiiiiiijjkkkkkkkkkkkllmmmmmmnnooo
abbccccdeffffiiiiiiiiiiiiiijjkkkkkkkkkkkllmmmmmmnnooo
abbccccdeffffiiiiiiiiiiiiiijjkkkkkkkkkkkllmmmmmmnnooo

所以基本上

  • 1" A"是第一列只有一个字符
  • 2" BB"是第二列,长度为2
  • 3" CCCC"是第三列,长度为4
  • 4" d"是第四列,长度为1
  • 5" E"是第五列,长度为1
  • 6" FFFF"是长度为4的第六列

正如我们从这个例子中看到的,我不能使用带空格或逗号的分隔符,它们都有不同的长度。请指出正确的方向。我只是想知道如何处理这个问题。

先谢谢你们!

4 个答案:

答案 0 :(得分:2)

您知道每列的length值,您可以使用String的substring方法。

string.substring(start, start+length);

其中start是列的起始索引,length是colume值的长度。

使用StringBuilder将其转换为csv格式。在计算列值时,请继续将它们与stringBuilder一起附加到,对象中。检索并附加最后一列后,使用toString()将其转换为String并写入您选择的流。

我建议你使用相同的StringBuilder对象,而不是为每一行创建一个新对象。一旦你把它写成流,只需将大小重置为零(StringBuilder.size(0))。

答案 1 :(得分:0)

也许您可以使用String中的indexOflastIndexOfsubstring方法?然后你可以找到你可以放置分隔符的地方。

String myString = "abbcccdee";

int lastCharIndex = 0;
while (true) {
    if(lastCharIndex == myString.length()){
        break;
    }
    //find char
    char nextChar = myString.charAt(lastCharIndex);
    //calculate first char position
    int firstCharIndex = myString.indexOf(nextChar);
    //calculate last char position
    lastCharIndex = myString.lastIndexOf(nextChar) + 1;
    //get value
    String value = myString.substring(firstCharIndex, lastCharIndex);
    System.out.println(value);
}

答案 2 :(得分:0)

  • 固定长度或可变长度的字符串是什么?
  • 如果您希望Java应用程序更通用或可重用,那么您 可以使用xml / xsd来定义模板,例如



<fileMessage class="MessageParser">
<field name="column1" type="java.lang.String" length="1" variable="id"/>
<field name="column2" type="java.lang.Integer" length="2" variable="age"/>
<field name="column3" type="java.lang.Long" length="4" variable="name"/>
<field name="column4" type="java.lang.String" length="1" variable="gender"/>
</fileMessage>
&#13;
&#13;
&#13;

  • 写一个变换器方法,它将读取该行并映射 字段到MessageParser对象中的相应变量。

将每一行移动到对象后,按照您想要的方式播放。

相信这需要更多努力,并且只有在具有不同列/行长度的不同文件时才应使用。 否则子串逻辑就可以了。

答案 3 :(得分:0)

使用univocity-parsers FixedWidthParserFixedWidthWriter

以下是一个例子:

// creates the sequence of field lengths you need
FixedWidthFieldLengths lengths = new FixedWidthFieldLengths(1, 2, 4, 1, 1, 4);

// creates the default settings for a fixed width parser
FixedWidthParserSettings settings = new FixedWidthParserSettings(lengths);

// creates a fixed-width parser with the given settings
FixedWidthParser parser = new FixedWidthParser(settings);

// parses all rows in one go.
List<String[]> allRows = parser.parseAll(new FileReader(new File("/path/to/file.txt")));

要将此内容写入CSV,请使用CsvWriter

CsvWriterSettings writerSettings = new CsvWriterSettings(); //many options here, check the tutorial
CsvWriter writer = new CsvWriter(new FileWriter(new File("/path/to/file.csv")), writerSettings);

// Writes the headers of the CSV file (not mandatory)
writer.writeHeaders("a", "bb", "cccc", "d", "e", "ffff");

// Here we just tell the writer to write everything and close the given output Writer instance.
writer.writeStringRowsAndClose(allRows); //this method is available in version 2.0.0-SNAPSHOT. If you use version 1.5.6 you must convert the rows to Object[]

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。