Позиционный плоский файл с вложенными записями - PullRequest
0 голосов
/ 04 сентября 2018

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

Как вы можете видеть ниже, есть несколько полей, которые можно использовать как идентификаторы тегов.

У нас есть «S» для начального тега, «I» для информации о клиенте, «F» для информации о счете, «N» для раздела примечаний и, наконец, «E» для конечного раздела. Как вы можете видеть, есть и повторяющиеся записи, и это сочетание вложения и использования позиционных записей доставляет мне проблемы. Итак, каждый F-раздел (заказчик) имеет свой набор повторяющихся накладных с пометкой.

Я попробовал подсказки в этом замечательном посте , но в этом вопросе, к сожалению, не существует вложенности.

Странно то, что мне удается получить то, что я хочу, если не принимать во внимание позиционные записи. Если я просто возьму все данные и поместу их в одно поле (т.е. весь F без позиционирования), я смогу получить правильную структуру, включая повторяющиеся. Но они позиционные, I, F и N, и вся моя борьба всегда приводит к ошибке, либо сообщающей, что она ищет букву идентификатора тега, либо что она ищет возврат каретки и конец строки. Буду признателен за любую помощь, так как я уже давно борюсь с этим.

Пример файла:

S                                                                                                                                                                                                       
I02710242Company name 01               Postboks 123 Sum                                            010223 14 15 50 54                            9597598396200468                             NO                                                                                                                                                                                      N                                                          
F141220178065428         00000102700-13012018000000080654288                                                                                                                  
NINK       !!!!!!!!!!!                                                                                                                                                                                                               
F141220178065429         00000197200-13012018000000080654296                                                                                                                  
NINK       !!!!!!!!!!!                                                                                                                                                                                                               
I02710242Company name 02               Postboks 234 Seum                                           010223 14 16 50 54                            9597598396200468                             NO                                                                                                                                                                                      N                                                          
F050120185794526         00003686250+04022018000000057945263                                                                                                                  
NINK       !!!!!!!!!!!                                                                                                                                                                                                               
F141220178065428         00000102700-13012018000000080654288                                                                                                                  
NINK       !!!!!!!!!!!                                                                                                                                                                                                               
F141220178065429         00000197200-13012018000000080654296                                                                                                                  
NINK       !!!!!!!!!!!                                                                                                                                                                                                               
E000000420000005000030679668+

Так что я думаю, что я хотел бы достичь (если только у кого-то из вас нет лучшей настройки), это схема, которая выглядит следующим образом:

S
---I
     -F
     -N
     -F
     -N

  -I 
     -F
     -N
     -F
     -N
E

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я подготовил для вас пример, это будет подтверждено вашим примером сообщения. Я сделал это без волшебника. Хотя Мастер является отличной отправной точкой для знакомства с некоторыми вещами, сложное вложение следует просто попробовать вручную.

Несколько замечаний:

  • Ваш детский заказ является инфиксным для каждого повторяющегося record.
  • У вас нет дочернего заказа для неповторяющихся, вместо этого они указаны как positional.
  • Разделитель - это перевод строки, если он повторяется. Это означает, что при каждом повторении record указывается указанный разделитель или указывается значение по умолчанию на уровне <Schema>.

Я думаю, что ваша проблема была частично в распознавании шаблона, как вы видите в моем примере, шаблон отличается; После строки I есть повторяющийся шаблон строк F и N, который я инкапсулировал в запись с именем Repeatingchild.

Вы все еще можете заставить свой шаблон работать;

  • Отредактируйте мой образец ниже, удалив запись Repeatingchild и поместив все элементы в запись Repeating.
  • Установите Parser Optimization на Complexity на уровне <Schema>, если вы этого не сделаете, у него будут проблемы с записью I.

Чего еще не хватает, так это вашего точного позиционного сопоставления для каждого поля, но я доказал позиционирование с помощью помещенных в него Irecord_part1 и Irecord_part2. Что я хотел бы сделать дальше, так это по-прежнему использовать мастер для каждой строки отдельно. сделать все элементы строки. Поэтому разделите каждую строку и запустите мастер для каждого типа строки.

Чтобы сделать его еще более красивым, вы можете создать отдельные схемы, представляющие заголовок и трейлер . Поэтому я думаю, что запись S будет заголовком, а запись E будет трейлером.

 <?xml version="1.0" encoding="utf-16"?>
    <xs:schema xmlns="StackOverflow.FlatFileSchema1" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="StackOverflow.FlatFileSchema1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:annotation>
        <xs:appinfo>
          <b:schemaInfo standard="Flat File" root_reference="Root" default_pad_char=" " pad_char_type="char" count_positions_by_byte="false" parser_optimization="speed" lookahead_depth="3" suppress_empty_nodes="false" generate_empty_nodes="true" allow_early_termination="true" early_terminate_optional_fields="false" allow_message_breakup_of_infix_root="false" compile_parse_tables="false" />
          <schemaEditorExtension:schemaInfo namespaceAlias="b" extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension" standardName="Flat File" xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" />
        </xs:appinfo>
      </xs:annotation>
      <xs:element name="Root">
        <xs:annotation>
          <xs:appinfo>
            <b:recordInfo structure="delimited" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="1" child_delimiter_type="hex" child_order="infix" child_delimiter="0x0A" />
          </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:annotation>
              <xs:appinfo>
                <b:groupInfo sequence_number="0" />
              </xs:appinfo>
            </xs:annotation>
            <xs:element minOccurs="1" maxOccurs="1" name="SRecord">
              <xs:annotation>
                <xs:appinfo>
                  <b:recordInfo structure="positional" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="1" tag_name="S" />
                </xs:appinfo>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:annotation>
                    <xs:appinfo>
                      <b:groupInfo sequence_number="0" />
                    </xs:appinfo>
                  </xs:annotation>
                  <xs:element name="Srecord" type="xs:string">
                    <xs:annotation>
                      <xs:appinfo>
                        <b:fieldInfo justification="left" sequence_number="1" pos_length="200" />
                      </xs:appinfo>
                    </xs:annotation>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element minOccurs="0" maxOccurs="unbounded" name="Repeating">
              <xs:annotation>
                <xs:appinfo>
                  <b:recordInfo sequence_number="2" structure="delimited" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" child_delimiter_type="hex" child_delimiter="0x0A" child_order="infix" repeating_delimiter_type="hex" repeating_delimiter="0x0A" />
                </xs:appinfo>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:annotation>
                    <xs:appinfo>
                      <b:groupInfo sequence_number="0" />
                    </xs:appinfo>
                  </xs:annotation>
                  <xs:element minOccurs="0" maxOccurs="unbounded" name="IRecord">
                    <xs:annotation>
                      <xs:appinfo>
                        <b:recordInfo structure="positional" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="1" tag_name="I" />
                      </xs:appinfo>
                    </xs:annotation>
                    <xs:complexType>
                      <xs:sequence>
                        <xs:annotation>
                          <xs:appinfo>
                            <b:groupInfo sequence_number="0" />
                          </xs:appinfo>
                        </xs:annotation>
                        <xs:element name="Irecord_part1" type="xs:string">
                          <xs:annotation>
                            <xs:appinfo>
                              <b:fieldInfo justification="left" sequence_number="1" pos_length="133" />
                            </xs:appinfo>
                          </xs:annotation>
                        </xs:element>
                        <xs:element name="Irecord_part2" type="xs:string">
                          <xs:annotation>
                            <xs:appinfo>
                              <b:fieldInfo sequence_number="2" justification="left" pos_length="200" />
                            </xs:appinfo>
                          </xs:annotation>
                        </xs:element>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                  <xs:element minOccurs="0" maxOccurs="unbounded" name="Repeatingchild">
                    <xs:annotation>
                      <xs:appinfo>
                        <b:recordInfo sequence_number="2" structure="delimited" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" child_delimiter_type="hex" child_delimiter="0x0A" child_order="infix" />
                      </xs:appinfo>
                    </xs:annotation>
                    <xs:complexType>
                      <xs:sequence>
                        <xs:annotation>
                          <xs:appinfo>
                            <b:groupInfo sequence_number="0" />
                          </xs:appinfo>
                        </xs:annotation>
                        <xs:element minOccurs="0" maxOccurs="unbounded" name="FRecord">
                          <xs:annotation>
                            <xs:appinfo>
                              <b:recordInfo structure="positional" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="1" tag_name="F" />
                            </xs:appinfo>
                          </xs:annotation>
                          <xs:complexType>
                            <xs:sequence>
                              <xs:annotation>
                                <xs:appinfo>
                                  <b:groupInfo sequence_number="0" />
                                </xs:appinfo>
                              </xs:annotation>
                              <xs:element name="Frecord" type="xs:string">
                                <xs:annotation>
                                  <xs:appinfo>
                                    <b:fieldInfo justification="left" sequence_number="1" pos_length="174" />
                                  </xs:appinfo>
                                </xs:annotation>
                              </xs:element>
                            </xs:sequence>
                          </xs:complexType>
                        </xs:element>
                        <xs:element minOccurs="0" maxOccurs="unbounded" name="NRecord">
                          <xs:annotation>
                            <xs:appinfo>
                              <b:recordInfo sequence_number="2" structure="positional" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" tag_name="N" />
                            </xs:appinfo>
                          </xs:annotation>
                          <xs:complexType>
                            <xs:sequence>
                              <xs:annotation>
                                <xs:appinfo>
                                  <b:groupInfo sequence_number="0" />
                                </xs:appinfo>
                              </xs:annotation>
                              <xs:element name="Nrecord" type="xs:string">
                                <xs:annotation>
                                  <xs:appinfo>
                                    <b:fieldInfo justification="left" sequence_number="1" pos_length="229" />
                                  </xs:appinfo>
                                </xs:annotation>
                              </xs:element>
                            </xs:sequence>
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
            <xs:element name="ERecord">
              <xs:annotation>
                <xs:appinfo>
                  <b:recordInfo structure="positional" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" tag_name="E" sequence_number="3" />
                </xs:appinfo>
              </xs:annotation>
              <xs:complexType>
                <xs:sequence>
                  <xs:annotation>
                    <xs:appinfo>
                      <b:groupInfo sequence_number="0" />
                    </xs:appinfo>
                  </xs:annotation>
                  <xs:element name="Erecord" type="xs:string">
                    <xs:annotation>
                      <xs:appinfo>
                        <b:fieldInfo justification="left" sequence_number="1" pos_length="29" />
                      </xs:appinfo>
                    </xs:annotation>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
0 голосов
/ 04 сентября 2018

Хитрость в том, что на одном шаге мастера вы выбираете целую повторяющуюся группу (I ... N) и устанавливаете группу из одного повторяющегося элемента.

Затем мастер перейдет к I ... N и попросит вас определить подзаписи, которые также могут повторять группы или записи с полями.

Нет ничего плохого в том, чтобы запустить Мастер несколько раз, чтобы получить правильную структуру. Мы все сделали это ... много раз.

...