在Progress 4GL中导出到文本文件时,为什么带空格的字段值包含新行?

时间:2014-07-11 12:58:27

标签: formatting progress-4gl openedge

我可以将数据导出到文本文件,但文本文件中的格式不好。例如,当字段值中包含空格时 - 它在文件中包含一个新行。

示例数据: 846438828 | 10121803 || HEIN | KATIE | 270 ||卵石
 CREEK | DR-|||美国| GA | 30605 || 7天| 1 | 2 | 842486060 | 1012 || GUNTER | LEWELL | 230 || MCDUFFIE | DR |||雅典| GA | 30605 | 7065430640 | FRI-SUN | 1 | 2 | 889388948 | 101205 ||周| J D | 183 || MELL | ST |||雅典| GA | 30605 | 7065481437 | SUNONLY | 1 | 2 |

字段streetname" PEBBLE" CREEK的值,但在报告中看起来像:

卵石

CREEK

为什么会这样?

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 个答案:

答案 0 :(得分:2)

这实际上只取决于一些事情,但如果没有看到你的代码就很难回答。

1)那里确实没有新线路。它只是看起来像它,因为你的texteditor打开文件时打破了行。如果是这种情况,最大化/更改编辑器的窗口大小将改变显示新行的位置。

2)该领域确实有一条新线。那将被导出。如果要使用EXPORT导出值,可以尝试执行以下操作来替换换行符:

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

如果这有效,则数据库中有新行。

3)导出数据的方式有问题。由于您没有发布示例代码(这样做总是一个好主意),我们无法了解这一点。

我的赌注是1号或2号。如果您使用像EXPORT这样简单的导出方法,那么你真的不应该遇到麻烦......

答案 1 :(得分:0)

Jens说的很多(我已将此作为评论,但Stack Overflow不会让我......)。

尝试在Notepad ++中打开文件并禁用View-&gt; Wrap,或者使用您选择的编辑器执行类似的操作。 线路馈送很可能“并不存在”。

答案 2 :(得分:0)

前段时间我遇到了同样的问题。问题出在数据域的内容上,其中有用户用密钥输入的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. 

这样做可能会解决您的问题。显然你可以用''by''代替。这取决于你的需求。

希望它有所帮助。

答案 3 :(得分:0)

看起来您遇到问题的字段是address.postdirectional。正如其他人所说,首先要检查的是数据中没有隐藏的换行符。

在过程编辑器/ tramlines中,尝试一些简单的事情:

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

您应该在该点看到数据中的任何换行符。