【问题标题】:Separating columns in excel using different characters as seperators在excel中使用不同的字符作为分隔符分隔列
【发布时间】:2013-12-27 15:17:48
【问题描述】:

我有一个以这种方式排列的几千个来源的 Excel:

示例 1:

Abbott KW, Snidal D (2009) The Governance Triangle: Regulatory Standards Institutions and the Shadow of the State. In: Mattli W , Woods N (eds) The Politics of Global Regulation, pp. 44–88. Princeton University Press, Princeton, NJ

示例 2:

Moschella M , Tsingou E (eds) (2013) Great Expectations, Slow Transformations: Incremental Change in Financial Governance. ECPR Press, Colchester

我需要用这些数据将它们分成 7 列:

  1. 第一作者
  2. 第二作者
  3. 第三位作者
  4. 出版年份
  5. 来源文章标题
  6. 发表于(不总是包括在内,但总是以 In: 开头)
  7. 更多信息 - 指在源文章标题中发表/之后的所有内容(如果它不是更大出版物的一部分)

我尝试在 excel 中使用拆分为列的工具,但由于数据种类繁多,我无法有效地做到这一点。 有谁知道解决这个问题?

【问题讨论】:

  • 那不是 Excel 文件,那是纯文本。或者是吗?我认为您需要提供更多信息和更多示例,以利用您在此处列出的所有“功能”。另外:这七项是否总是按照您所说的顺序出现?
  • 所有作者之间是否用逗号分隔?例2中第二作者之后的(eds)有什么意义?
  • excel 文件的行看起来与我在此处给出的行非常相似。这些项目总是以相同的顺序出现,但有时项目 6 不包括在内,并且作者的数量也不同。作者用逗号分隔,eds没有意义,可以去掉。

标签: python excel citations vba


【解决方案1】:

请参阅How to split Bibiliography MLA string into BibTex using c#?,我在其中链接了几个用于从格式化文本中提取书目信息的专用工具。

【讨论】:

  • 非常感谢!我看了你发布的内容,我认为 freecite 对我来说是最好的选择,但是我不知道在大量数据上运行它的最佳方法是什么,因为我从未使用过 ruby​​ 或 perl。你能推荐一个方法吗?
  • text2bib 可能更容易,因为它会输出一个 BibTeX 文件。您最终需要 Excel 中的书目详细信息吗?
  • 还有Anystyle-Parser,它比较新,如果你能找到人帮助你运行它,可能也是一个不错的选择。
【解决方案2】:

试试这个 VBA 宏。它使用正则表达式来解析出不同的段;但如果数据不是你呈现的方式,它就会失败;因此,如果出现故障,您需要查看它与我的假设或您提供数据的方式有何不匹配。

宏假设数据从 A1 开始,在 A 列,第 1 行没有标签。结果写入 B 列及后续;带有第 1 行的标签——但这些可以放在任何地方。

此代码进入常规模块。

Option Explicit
Sub ParseBiblio()
    Dim vData As Variant
    Dim vBiblios() As Variant
    Dim rRes As Range
    Dim re As Object, mc As Object
    Dim I As Long

'Assume Data is in column A.
'Might need to start at row 2 if there is a label row
vData = Range("A1", Cells(Rows.Count, "A").End(xlUp))

'Results to start in Column B with labels in row 1
Set rRes = Range("b1")

Set re = CreateObject("vbscript.regexp")
With re
    .MultiLine = True
    .Global = True
    .ignorecase = True
    .Pattern = "(^[^,]+),?\s*([^,]+?)(?:,\s*([^(]+))?\s*\((\d{4})\)\s*(.*?\.)\s*(?:In:\s*(.*)\.)?\s*(.*)"
End With

'Results array and labels
ReDim vBiblios(1 To UBound(vData) + 1, 1 To 7)
    vBiblios(1, 1) = "First Author"
    vBiblios(1, 2) = "Second Author"
    vBiblios(1, 3) = "Other Authors"
    vBiblios(1, 4) = "Publication Year"
    vBiblios(1, 5) = "Title"
    vBiblios(1, 6) = "Published In"
    vBiblios(1, 7) = "More Info"

For I = 1 To UBound(vData)
    Set mc = re.Execute(vData(I, 1))
    If mc.Count > 0 Then
        With mc(0)
            vBiblios(I + 1, 1) = .submatches(0)
            vBiblios(I + 1, 2) = .submatches(1)
            vBiblios(I + 1, 3) = .submatches(2)
            vBiblios(I + 1, 4) = .submatches(3)
            vBiblios(I + 1, 5) = .submatches(4)
            vBiblios(I + 1, 6) = .submatches(5)
            vBiblios(I + 1, 7) = .submatches(6)
        End With
    End If
Next I

Set rRes = rRes.Resize(rowsize:=UBound(vBiblios, 1), columnsize:=UBound(vBiblios, 2))
rRes.EntireColumn.Clear
rRes = vBiblios
With rRes
    With .Rows(1)
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
    End With
    .EntireColumn.AutoFit
End With

End Sub

【讨论】:

  • 谢谢罗恩!您的脚本运行良好并给出了正确的结果,但它只在 excel 中的每个奇数行上运行,并将结果发布在偶数行中。你能向我解释一下如何修复它,让它在所有行上运行并在与原始行相同的行上输入结果吗?谢谢
  • 到目前为止结果与数据偏移了一行,那是因为我添加了一个标签行。如果您不想要标签,请将其删除并将结果数组的索引从 I+1 更改为 I (并且还将该数组的大小减小一且没有标签。关于处理每隔一行,即您提供的数据并非如此。也许您的“偶数行”数据有所不同?
  • 更大的问题是结果是每隔一行。所有行都有相同的信息,所以我没有看到任何差异。有没有办法我可以将文件的一部分发送给您以检查是否存在问题?
  • 你可以发邮件给我。在反转字符串并进行明显替换后使用 mocTODenilnodlefnesorTAnor。或者将其发布到 SkyDrive 或 Dropbox 等公共网站,然后在此处发布链接。
  • OP 的文件显示当只有一个作者时发生匹配失败。这已通过在正则表达式中使第一个逗号可选(我的答案已被编辑以更正该问题)得到纠正。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2015-04-18
相关资源
最近更新 更多