Почему значение поля с пробелом содержит новую строку при экспорте в текстовый файл в Progress 4GL?

Я могу экспортировать данные в текстовый файл, но форматирование в текстовом файле не очень хорошо. Например, если в нем есть пробел, он содержит новую строку в файле.

Примеры данных: 846438828 | 10121803 || HEIN | KATIE | 270 || PEBBLE КРИК | DR ||| США | GA | 30605 || 7day | 1 | 2 | 842486060 | 1012 || GUNTER | LEWELL | 230 || McDuffie | ДР ||| АФИНЫ | Г.А. | 30605 | 7065430640 | ПТ-ВС | 1 | 2 | 889388948 | 101205 || НЕДЕЛЬ | JD | 183 || MELL | ST ||| ATHENS | Г.А. | 30605 | 7065481437 | SUNONLY | 1 | 2 |

Значение поля имя улицы "PEBBLE" CREEK, но в отчете это выглядит так:

PEBBLE

КРИК

Почему это происходит?

def var v-copies as inte no-undo.
def var v-phone as char format "x(16)" no-undo.
def var v-loc as char no-undo.
def var v-file as char format "x(30)" no-undo.
def var v-demoid as char format "x(20)" no-undo.
def var v-email as char format "x(30)" no-undo.
def var v-hostname as char format "x(20)" no-undo.

def var v-RouteIDs as char no-undo.
def var v-Product as char no-undo.
def var v-ExDir as char format "x(80)" no-undo. 
def var v-LookBack as int no-undo init 90.

{tools/altpubs/audit/var.i}
{tools/altpubs/audit/procedures.i}

def stream sout.

def temp-table tt-demo 
 field entityid as int format ">>>>>>>>>9"
 field answer like DemographicAnswer.Answer.


v-ConfigFile = search(v-ConfigFile). 
if v-ConfigFile = ? then do:
 message "config file config.csv was not found" view-as alert-box.
 RETURN "ERROR".
end. 

input from value(v-ConfigFile).
run ReadConfig.
input close.

for each tt-Config where tt-Config.Section = 'local' and
 tt-Config.SectionValue <> ?:
 v-loc = tt-Config.SectionValue.
 case tt-Config.SettingName:
 when 'ExchDir' then v-ExDir = tt-Config.SettingValue.
 when 'Product' then v-Product = tt-Config.SettingValue.
 when 'Routes' then v-RouteIDs = tt-Config.SettingValue.
 when 'LookBack' then 
 do:
 v-LookBack = integer(tt-Config.SettingValue) no-error.
 if error-status:error then v-LookBack = 90.
 end.
 end.
end.

v-ExDir = v-Exdir + lc(v-loc) + "/". 
file-info:file-name = v-ExDir.
if not( file-info:file-type begins "D") or file-info:file-type = ? then
do:
 unix silent makedir value(v-ExDir) && chmod 777 value(v-ExDir).
 file-info:file-name = v-ExDir.
end.

assign
 v-File = v-ExDir + lc(v-Product) + "Audit" +
 string(month(today),"99") + "-" +
 string(day(today),"99") + "-" +
 substring(string(year(today),"9999"),3) + ".txt".

for each DemographicAnswer where DemographicAnswer.DemographicId = v-RouteIDs 
 no-lock:
 create tt-demo.
 assign tt-demo.entityid = int(DemographicAnswer.EntityId)
 tt-demo.answer = DemographicAnswer.Answer.
 end.

output stream sout to value(v-file). 

put stream sout unformatted 
 "HEADER B2 " string(today) skip. 

for each tt-demo,
 each Subscription no-lock
 where Product = v-product 
 and SubscriptionID = tt-demo.entityid
 and Subscriber = yes
 and Getspaper = yes:

 find last RouteSubscription of Subscription no-lock no-error.
 if available routeSubscription then do:

 for each Occupant of Subscription no-lock, 
 each Address of Subscription no-lock:

 find OccupantPhone of Occupant no-lock no-error.
 if available OccupantPhone then 
 v-phone = OccupantPhone.AreaCode + OccupantPhone.Phone.
 else 
 v-phone = "".

 find last OccupantEmail of Occupant no-lock no-error.
 if available OccupantEmail then 
 v-email = OccupantEmail.EmailAddress. 
 else
 v-email = "".

 case DeliveryScheduleId:
 when "MON-FRI" then v-copies = RouteSubscription.Copies[2].
 when "FRI-SUN" then v-copies = RouteSubscription.Copies[1].
 when "SUNONLY" then v-copies = RouteSubscription.Copies[1].
 when "7DAY" then v-copies = RouteSubscription.Copies[1].
 when "MON-SAT" then v-copies = RouteSubscription.Copies[2].
 when "THUONLY" then v-copies = RouteSubscription.Copies[5].
 when "WEDONLY" then v-copies = RouteSubscription.Copies[4].
 when "SATSUN" then v-copies = RouteSubscription.Copies[1].
 end case.

 put stream sout unformatted
 tt-demo.Answer "|" 
 Subscription.SubscriptionId "|" 
 Subscription.Product "|"
 Occupant.LastName "|"
 Occupant.FirstName "|" 
 trim( Address.HouseNumber) "|" 
 trim(Address.Postdirectional) "|" 
 trim(Address.StreetName) "|" 
 trim(Address.StreetSuffixId) "|" 
 trim(Address.postdirectional) "|" 
 trim(Address.UnitDesignatorID + trim(Address.UnitNumber)) "|"
 Address.CityId "|" 
 Address.StateId "|"
 Address.ZipCode "|"
 v-phone "|" 
 Subscription.DeliveryScheduleId "|" 
 v-copies "|"
 "2" "|"
 v-email skip.
 end.
 end.
end.
put stream sout unformatted
 "TRAILER ".
output stream sout close.
4 ответа

Это может зависеть только от нескольких вещей, но трудно ответить, не видя кода.

1) Там действительно нет новой линии. Он выглядит только так, поскольку ваш текстовый редактор разбивает строку при открытии файла. Если это так, то максимизация/изменение размера окна вашего редактора будет меняться там, где отображается новая строка.

2) В этой области действительно есть новая линия. Это будет экспортировано. Если вы экспортируете значения с помощью EXPORT, вы можете попытаться сделать что-то вроде этого, чтобы заменить новые строковые символы:

EXPORT REPLACE(streetname, "~n","").

Если это имеет эффект, у вас есть новые строки в вашей базе данных.

3) Что-то не так с тем, как вы экспортируете данные. Поскольку вы не используете код примера для публикации (это всегда хорошая идея), мы не можем знать об этом.

Мои ставки на номера 1 или 2. Если вы используете простой способ экспорта, например, EXPORT, вам действительно не нужно беспокоиться...


Некоторое время назад у меня была такая же проблема. Проблема заключалась в содержании поля данных, в котором были введены CHR (10) (строка) и CHR (13) (возврат каретки), введенные пользователями с ключом. Я нашел простое решение, чтобы обойти это, создав функцию для преобразования этих символов в '' и используя ее с операторами PUT. Например, я использую два ваших поля...

FUNCTION stringExport RETURNS CHAR
 ( INPUT p-input AS CHAR ):

 RETURN TRIM(REPLACE(REPLACE(p-input,CHR(13),''),CHR(10),'')).

END FUNCTION. /* stringExport */

PUT STREAM sout UNFORMATTED 
 stringExport(Occupant.FirstName) "|"
 stringExport(Address.HouseNumber) "|" SKIP.

Вы можете решить эту проблему. Очевидно, вы можете заменить "на". Это зависит от ваших потребностей.

Надеюсь, поможет.


Похоже, что в поле, с которым у вас возникают проблемы, address.postdirectional. Как говорили другие, первое, что нужно проверить, это то, что в данных нет скрытого разрыва строки.

В редакторе процедур/трамвайных линиях попробуйте что-то простое:

for each address no-lock: 
 display procedure.postdirectional.
end.

Вы также должны увидеть разрывы строк в данных в этот момент.


В значительной степени, что сказал Йенс (я бы оставил это в качестве комментария, но Qaru не позволит мне..).

Попробуйте открыть файл в Notepad++ и отключить View-> Wrap или сделать аналогичную вещь с редактором по вашему выбору. Линейные переводы, скорее всего, "на самом деле не там".

licensed under cc by-sa 3.0 with attribution.