Разделить список на список списков по значению - PullRequest
2 голосов
/ 18 июня 2020

Я хочу разбить список, например

c('SET ANSI_NULLS ON',
  'GO',
  'SET QUOTED_IDENTIFIER ON',
  'GO',
  'CREATE TABLE dbo.Person(',
  ' Person int NOT NULL,',
  ' acct varchar(1) NOT NULL,',
  ' Kpl varchar(10) NULL,',
  ' Fac varchar(10) NULL,',
  ' Inst varchar(10) NULL,',
  ' CONSTRAINT PK_Person PRIMARY KEY CLUSTERED ',
  '(',
  ' Person ASC',
  ')WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY',
  ') ON PRIMARY',
  'GO',
  'ALTER TABLE dbo.Person ADD  DEFAULT (getdate()) FOR _Timestamp',
  'GO',
  'ALTER TABLE dbo.Person ADD  DEFAULT (host_name()) FOR _Hostname',
  'GO',
  'ALTER TABLE dbo.Person ADD  DEFAULT (original_login()) FOR _Username',
  'GO'
) 

, на список-списков, начиная новый список всякий раз, когда будет найдено значение GO:

c(c('SET ANSI_NULLS ON'),
  c('SET QUOTED_IDENTIFIER ON'),
  c('CREATE TABLE dbo.Person(',
    ' Person int NOT NULL,',
    ' acct varchar(1) NOT NULL,',
    ' Kpl varchar(10) NULL,',
    ' Fac varchar(10) NULL,',
    ' Inst varchar(10) NULL,',
    ' CONSTRAINT PK_Person PRIMARY KEY CLUSTERED ',
    '(',
    ' Person ASC',
    ')WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON PRIMARY',
    ') ON PRIMARY'
  ),
  c('ALTER TABLE dbo.Person ADD  DEFAULT (getdate()) FOR _Timestamp'),
  c('ALTER TABLE dbo.Person ADD  DEFAULT (host_name()) FOR _Hostname'),
  c('ALTER TABLE dbo.Person ADD  DEFAULT (original_login()) FOR _Username')
) 

1 Ответ

1 голос
/ 18 июня 2020

Это работает для вас?

go_pos <- grep("GO", x) # find positions of "GO"s
go_groups <- cumsum(grepl("GO", x))[-go_pos] # build a grouping for split() then drop "GO"s
split(x[-go_pos], go_groups) # drop "GO"s then split on groups
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...