【问题标题】:EXCEL - Fuse text cells and split into different linesEXCEL - 融合文本单元格并分成不同的行
【发布时间】:2016-09-07 16:06:41
【问题描述】:

我有一个看起来像这样的文件,其中包含大量数据

>ENSMUSG00000020333|ENSMUST00000000145|Acsl6
AGCTCCAGGAGGGCCCGTCTCAGTCCGATGAACTTTGCAGCAATATTATAGTTATTCGTG
GTTCACAGAATTCCATTAAACATAAAGAAAAAACATAA
>ENSMUSG00000000001|ENSMUST00000000001|Gnai3
GAGGATGGCATAGTAAAAGCTATTACAGGGAGGAGTGTTGAGACCAGATGTCATCTACTG
CTCTGTAATCTAATGTTTAGGGCATATTGAAGTTGAGGTGCTGCCTTCCAGAACTTAAAC

应转换列,以便行始终包含:

ENSMUSG***      ENSMUST***    GeneName     Sequence (four separate columns)

序列列应该是以 A、C、G 或 T 开头的行融合到一个文本单元格中,要融合的单元格数量因基因而异。

有没有人建议如何解决这个问题?

非常感谢您的帮助! 最良好的祝愿 kk

【问题讨论】:

  • 数据 > 文本到列 > "|"分隔符
  • 例如,INPUT A1 ">ENSMUSG00001 | ENSMUST00017 | Gnai3" ... A2 "AGATACAGCC" ... A3 "GTACATCTAC" ... A4 "CTATTCAAGCATAC" ... A5 "> ENSMUSG00002 | ENSMUST000023 | Asic2" ... 等...带有文本到列或导入功能“|”作为分隔符 ... OUTPUT ... A1 ">ENSMUSG00001" ... B1 "ENSMUST00017" .... C1 "Gnai3" ... D1 现在应该是 =A2&A3&A4 .... 包含序列部分的单元格数是变量,可以在 2 到 10 之间 ...

标签: excel split lines


【解决方案1】:

使用Data 标签上的Text to Columns 按钮。选择Delimited,单击Next,然后选择Other,并在框中键入管道符号|。然后点击NextFinish

【讨论】:

  • 这很好,除了一点,在基因名称和序列之间似乎没有|。因此,需要另一个步骤来进行最后一次拆分。如果名称始终是一个单词,也许对空间的新第三列进行第二次拆分?
  • 亲爱的斯科特,非常感谢您的快速响应...分离前三列这个js当然很容易...问题是序列行...澄清...那里a 列中有 2 到 10 个单元格,必须融合然后插入 d 列...我知道您可以通过 =a2&a3& 等方式删除单元格,但这应该以自动化方式工作,因为它们有更多 20'000基因...
【解决方案2】:

我相信只有拥有 Office 365 订阅的用户才具有工作表功能 CONCAT,这在这种情况下可能很有用。所以我会用 VBA 宏来做到这一点。

  • 第一行 -- 使用管道 | 分隔符分割
  • 然后连接下一行,直到找到不以“A”、“C”、“G”、“T”开头的行
  • 将结果存储在Collection 对象中
  • 将结果写回工作表。

由于您有一个大型数据库,因此“工作”在 VBA 数组中完成,因为这将更快地处理。

假设你的数据在A列,从A1开始;并且您的结果将写在 B:E 列中

如果您的数据库是干净的,并且按照您显示的那样格式化,它应该可以正常工作。如果它不属于您提供的格式,则可能需要添加一些错误检查。


Option Explicit
Sub Organize()
    Dim COL As Collection
    Dim vSrc As Variant, vRes As Variant
    Dim WS As Worksheet, rRes As Range
    Dim V As Variant, W As Variant, S As String
    Dim I As Long, J As Long

Set WS = ActiveSheet
With WS
    Set rRes = .Cells(1, 2)
    vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

Set COL = New Collection
For J = 1 To UBound(vSrc, 1)
ReDim vRes(0 To 3)
    W = Split(vSrc(J, 1), "|")  'First line
    For I = 0 To 2
        vRes(I) = W(I)
    Next I

    S = ""

    'Concatenate subsequent lines
    'Could look for the "<" but OP gave specifice starting letters
    '  So will use that

    Do
        Select Case Left(vSrc(J + 1, 1), 1)
            Case "A", "C", "G", "T"
                S = S & vSrc(J + 1, 1)
            Case Else
                Exit Do
        End Select
        J = J + 1
    Loop Until J = UBound(vSrc, 1)

    vRes(3) = S
    COL.Add vRes
Next J

ReDim vRes(1 To COL.Count, 1 To 4)
I = 0
For Each W In COL
    I = I + 1
    For J = 1 To 4
        vRes(I, J) = W(J - 1)
    Next J
Next W

Set rRes = rRes.Resize(rowsize:=UBound(vRes, 1), columnsize:=UBound(vRes, 2))
With rRes
    .EntireColumn.Clear
    .Value = vRes
    .EntireColumn.AutoFit
End With

End Sub

【讨论】:

    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 2018-01-10
    • 2015-01-04
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多