retorquere
retorquere

Reputation: 1546

Split list into list of lists on value

I am looking to split a list such as

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'
) 

into a list-of-lists, starting a new list whenever the value GO is found:

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')
) 

Upvotes: 2

Views: 42

Answers (1)

Nate
Nate

Reputation: 10671

Does this work for you?

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

Upvotes: 1

Related Questions