首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >uniVocity -按位置转换为列表

uniVocity -按位置转换为列表
EN

Stack Overflow用户
提问于 2017-02-23 20:55:51
回答 2查看 973关注 0票数 1

我正在尝试从csv文件中的特定位置创建一个列表,而不是括号。

代码语言:javascript
复制
class Person {//
@Parsed
private String name;
@??
private Address address;
@Convert(conversionClass = Emails2.class, args = { "," , "5,6" })
@Parsed
private List<String> emails;
}

csv格式:

代码语言:javascript
复制
name,email1,email2,email3,street,number,neighborhood
Maria,ma@gmail.com,ma@hotmail.com,,Regent Street,12,downtown
Ana,ana@gmail.com,a@hotmail.com,,Bird Street,,east side

我需要阅读csv文件并创建一个电子邮件列表和地址对象。我试着用“转换”,

代码语言:javascript
复制
public class Emails2 implements Conversion<String, Set<String>> {

    private final String separator;
    private final Set<String> positions;

    public Emails2(String... args) {
        String separator = ",";
        Set<String> positions = null;

        if (args.length == 1) {
            separator = args[0];
        }

        if (args.length == 2) {
            positions = new HashSet<String>();
            String[] posi = args[1].split(",");
            for (String string : posi) {
                positions.add(string);
            }
        }
        this.separator = separator;
        this.positions = positions;
    }

    public Emails2(String separator, Set<String> positions) {
        this.separator = separator;
        this.positions = positions;
    }
//this method is not called, I don't know why
    public Set<String> execute(String input) { //I would like add the list and Address object inside this method to get it done in beanProcessed(...)
        if (input == null) {
            return Collections.emptySet();
        }

        Set<String> out = new TreeSet<String>();
        for (String token : input.split(separator)) {
            for (String word : token.trim().split("\\s")) {
                out.add(word.trim());
            }
        }
        return out;
    }

    public String revert(Set<String> input) {
        return revert(input);
    }

}

我做得怎么样

代码语言:javascript
复制
    public static void main(String[] args) {

            BeanProcessor<Person> rowProcessor = new BeanProcessor<Person>(Person.class) {
                @Override
                public void beanProcessed(Person c, ParsingContext context) {
                    System.out.println(c.getName());

                    String[] positions = context.currentParsedContent().split(","); 
                    System.out.println(positions[5]);
//I'm using fixed position here, I'd like get the position from @Convert or another way by configuration
                    System.out.println(positions[6]);
                    List<String> list = new ArrayList<>();
                    list.add(positions[5]);
                    list.add(positions[6]);
                    c.setEmails(list);
                }

            };

            CsvParserSettings parserSettings = new CsvParserSettings();
            parserSettings.setRowProcessor(rowProcessor);
            parserSettings.setHeaderExtractionEnabled(true);
            CsvParser parser2 = new CsvParser(parserSettings);
            parser2.parse(getReader("/var/lib/cob/test2.csv"));

        }
EN

回答 2

Stack Overflow用户

发布于 2017-02-25 23:48:56

您正在尝试通过自定义转换将多个列(email1email2email3)的值赋值到单个属性(Person.emails)中,但由于转换的目标是单个字段(或输入的列),而不是整行,因此不支持该值。

此外,您的自定义转换中的execute方法将不会被调用,因为输入中没有emails头。当您用@Parsed注释注释属性而不提供要匹配的标头名称时,将使用属性名称本身。如果将属性从emails重命名为email1,则将调用转换类,或者只需在注释中提供字段名,如下所示:

代码语言:javascript
复制
@Parsed(field = "email1")
private List<String> emails;

它也将被称为。

我看到了您在这里试图做的事情,并打开了本期,以便为这种需求提供更好的支持。

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2017-02-26 02:52:37

我用另一种方式实现了我想要的,不像我想要的那样,但成功了。我使用MultiBeanProcessor并创建了虚拟类(我的老板不喜欢)来表示我的csv职位。

我真正的csv有如下标题:

email1,email2,email3,dddcel1,dddcel2,dddcel3,dddcel4,dddtel1,dddtel2,dddtel3,firstName,document,v_atu,ofe_cc,ignore1,bank,agency,ignore2,invoiceNumber,contactPhone,address,街道,zip,城市,州

代码语言:javascript
复制
    class Email{
    @Parsed 
    private String email1;
    @Parsed 
    private String email2;
     @Parsed
    private String email3;
    }

class Mobile{
    @Parsed
    private String dddcel1;
    @Parsed
    private String dddcel2;
    @Parsed
    private String dddcel3;
    @Parsed
    private String dddcel4;
}

和MultiBeanProcessor

代码语言:javascript
复制
 MultiBeanProcessor processor = new MultiBeanProcessor(Customer.class, Address.class, Email.class, Mobile.class, Phone.class) {
            private Customer customer;
            private Address address;
            private Email email;
            private Mobile mobile;
            private Phone phone;

            @Override
            public void beanProcessed(Class<?> beanType, Object beanInstance, ParsingContext context) {

                if (beanType == Customer.class) {
                    customer = (Customer) beanInstance;
                    customer.set_id(UUID.randomUUID().toString());
                    customer.setStatus(CustomerStatusType.PENDING);
                    customer.setDiscountValue(customer.getInvoiceValue() - customer.getTotalValue());
                    customer.setToken(UUID.randomUUID().toString());
                    try {
                        customer.setCreated(new java.text.SimpleDateFormat("yyyy-MM-dd")
                                .parse((new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date()))));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                    customer.setDomain("???????????");
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("banco", customer.getBank());
                    map.put("agencia", customer.getAgency());
                    customer.setInvoiceDetail(map);

                }

                if (beanType == Address.class) {
                    address = (Address) beanInstance;
                    customer.setAddress(address);
                }

                if (beanType == Email.class) {
                    email = (Email) beanInstance;
                    customer.setEmails(Arrays.asList(email.getEmail1(), email.getEmail2(), email.getEmail3()));
                }

                if (beanType == Mobile.class) {
                    mobile = (Mobile) beanInstance;
                    customer.setMobiles(Arrays.asList(mobile.getDddcel1(), mobile.getDddcel2(), mobile.getDddcel3(), mobile.getDddcel4()));

                }

                if (beanType == Phone.class) {
                    phone = (Phone) beanInstance;
                    customer.setPhones(Arrays.asList(phone.getDddtel1(), phone.getDddtel2(), phone.getDddtel3()));
                }

                if (customer != null && address != null && email != null && mobile != null & phone != null) {
                    System.out.println(customer);//save customer object
                    customer = null;
                    address = null;
                    email = null;
                    phone = null;
                    mobile = null;
                }

            }
        };

我还在测试,我希望它适用于500 K行:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42426007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档