09.10.2008, 15:25 | #1 |
Участник
|
Импорт CSV + изменения в файле.
Доброго времени суток.
Господа, вопрос заключается в следущем. Есть файл формата scv. В системе написана процедура импорта. Открывается и обрабатывается файл методами класса AsciiIo и построчно читается в контейнер, который и обрабатывается. Но в процессе обработки возникает необходимость изменить данные в самом файле. Например, заполнить некоторую ячейку значением "Импорт строки произведен" Файл открывается с аттрибутом "R" -для чтения: AsciiIo = new AsciiIo(FileSmartexSales,"R"); Есть ли какой-нибудь аттрибут, типа FOR APPEND, и можно ли как то внести нужные изменения в файл?? Если можно, то как? Спасибо. P.S. Прошу ногами не пинать, ибо новичек. |
|
09.10.2008, 15:30 | #2 |
Участник
|
значение атрибута "w" позволяет запирывать
PS пример работы с классом можно посмотреть в AOT/System Documentation Последний раз редактировалось ice; 09.10.2008 в 15:32. |
|
09.10.2008, 15:33 | #3 |
Участник
|
попробовал так, но затерлись все данные в файле.
|
|
09.10.2008, 15:35 | #4 |
Участник
|
попробуйте например считанные(и измененные) строчки записывать в текстовый буфер, а потом перезаписать файл
PS неуверен, но помоему есть значение аргумента "a" для добавления записей Последний раз редактировалось ice; 09.10.2008 в 15:40. |
|
09.10.2008, 15:43 | #5 |
Участник
|
Не давно делал так.
Надо было ещё один столбик с данными в файл добавить. X++: CommaIo fileR; CommaIo fileW; container c; InventTable inventTable; ItemId itemId; ; fileR = SysDataIntegration::openFile("c:\\Node_Item_Ucp_080819.csv","R",";"); fileW = SysDataIntegration::openFile("c:\\Node_Item_Ucp_080819_W.csv","W",";"); c = fileR.read(); while (fileR.status() == IO_Status::OK) { c = fileR.read(); itemId = conpeek(c,1); inventTable = InventTable::find(itemId); if(inventTable) c += inventTable.NetWeight; else c+="Нет такой"; fileW.write(c); }
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
09.10.2008, 16:10 | #6 |
Участник
|
Так все-таки что нужно - добавлять новые записи, или модифицировать существующие? В любом случае напрямую работать с полями CSV файла Аксапта не умеет. Логично закачать данные в промежуточный буфер, в нем изменить и выгрузить через тот же Asciio или Commaio. В качестве буфера можно, например, использовать Struct.
|
|
10.10.2008, 06:20 | #7 |
Участник
|
Coolibin,
Необходимо модифицировать запись. Благодарю, кажется начинает проясняться. Думаю, и в правду нужно обработать записи, модифицировать, и когда всё закончится снова сохранить в файле. P.S. Ice, если открывать с атриббутом "A", то в контейнер при попытке чтения ничего не возвращается. Последний раз редактировалось bobski; 10.10.2008 в 06:58. |
|
10.10.2008, 10:09 | #8 |
Участник
|
Но возникла другая проблема.
Сначала запись читается в контейнер. Затем, полученный контейнер добавляется к некоторому новому контейнеру + признак новой строки. И так пока IO_Status::Ok. После того, как цикл закончится в тот же файл забивается собранный нами контейнер. Все вроде бы правильно, но в самом файле, начиная со второй строки данные сдвигаются на ячейку вправо. Т.е. если просмотреть в текстовом виде, то начиная со второго номера перед каждой строкой стоит строковый разделитель. Как это победить? Ничего не выходит Вот как это делаю: X++: AsciiIO = new AsciiIO(FileName, "R"); AsciiIo.inRecordDelimiter('\r\n'); AsciiIo.inFieldDelimiter(';'); while (AsciiIo.status() == IO_Status::Ok) { Data_Container = AsciiIo.read(); ontainer_New += conins(Data_Container,conlen(Data_Container)+1,'\n'); ... } AsciiIO = new AsciiIO(FileName, "W"); AsciiIo.OutRecordDelimiter('\r\n'); AsciiIo.OutFieldDelimiter(';'); AsciiIo.write(Data_container_New); |
|
10.10.2008, 13:57 | #9 |
Участник
|
Цитата:
Сообщение от bobski
Как это победить? Ничего не выходит
Вот как это делаю: X++: AsciiIO = new AsciiIO(FileName, "R"); AsciiIo.inRecordDelimiter('\r\n'); AsciiIo.inFieldDelimiter(';'); while (AsciiIo.status() == IO_Status::Ok) { Data_Container = AsciiIo.read(); ontainer_New += conins(Data_Container,conlen(Data_Container)+1,'\n'); ... } AsciiIO = new AsciiIO(FileName, "W"); AsciiIo.OutRecordDelimiter('\r\n'); AsciiIo.OutFieldDelimiter(';'); AsciiIo.write(Data_container_New); X++: AsciiIo.inRecordDelimiter('\r\n'); AsciiIo.inFieldDelimiter(';'); while (AsciiIo.status() == IO_Status::Ok) { Data_Container = AsciiIo.read(); if (Data_Container != connull()) { f1 = conpeek(Data_Container, 1); f1 = f1 + 1; // изменяем значение первого поля Data_Container = conPoke(Data_Container, 1, f1); //Вata_Сontainer_New += conins(Data_Container,conlen(Data_Container)+1,'\n'); Data_container_New = conIns(Data_container_New, conLen(Data_container_New) + 1, Data_Container); //... } } AsciiIO = new AsciiIO(@"D:\TEMP\test2.csv", "W"); AsciiIo.OutRecordDelimiter('\r\n'); AsciiIo.OutFieldDelimiter(';'); //AsciiIo.write(Data_container_New); for (i = 1; i < conlen(Data_container_New) + 1; i++) { AsciiIo.write(conpeek(Data_container_New, i)); } |
|
10.10.2008, 14:55 | #10 |
Участник
|
|
|