Извлечение данных из ячейки Excel, таких как телефон, электронная почта, адрес, идентификатор и т. Д. - PullRequest
0 голосов
/ 04 августа 2020

У меня есть данные, как показано ниже, в одной ячейке Excel.

56.  MEMBER ID   2100343-219
ZAHID BROTHERS
MONTGOMERY BAZAR FAISALABAD TEL :   041-2646252
MOBILE : 0300-0321-9663180 FAX :
E-MAIL :
REP :   HAJI MUHAMMAD ABID

Я ищу идеи о том, как извлечь каждую деталь и сформировать правильную таблицу Excel. Я бы предпочел использовать pandas. Но приемлемо любое жизнеспособное решение.

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

Предполагая, что ваши данные находятся в постоянном формате, с 6 строками, разделенными lineFeed, и данными в формате, который вы показываете, вы можете сделать это, используя Power Query (доступно в Excel 2010 +)

Алгоритм

  • Разделить столбцы по разделителю lf на новые строки
  • Добавить столбец Index, а затем Integer/Divide столбец ( на 6), чтобы получить последовательность чисел, в которой мы можем сгруппировать оригинал (последовательность будет иметь вид {0,0,0,0,0,0,1,1,1,1,1,1,2,...}
  • Сгруппировать оригинал по столбцу Integer / Divide
  • Извлечь каждый элемент, используя различные функции разделения и индексы для возврата того, что мы хотим.

В этом примере я предположил, что lf в вашем примере в вашем комментарии находятся в том же месте, что и показанный пример.

M-код

Если вы поместите курсор в столбец данных и Data-->Get & Transform-->From Table/Range, он создаст таблицу и пометит столбец Column1 .Если вы затем вставите M-код в расширенный редактор в PQ и измените имя таблицы в L Если имя 2 присвоено вашим данным, запрос должен работать. Вы можете исследовать область Steps, чтобы понять, что происходит

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(Source, {{"Column1", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Column1"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Column1", type text}}),

    //Add Index and Integer/Divide column for subsequent grouping
    #"Added Index" = Table.AddIndexColumn(#"Changed Type1", "Index", 0, 1, Int64.Type),
    #"Inserted Integer-Division" = Table.AddColumn(#"Added Index", "Integer-Division", each Number.IntegerDivide([Index], 6), Int64.Type),
    
    #"Removed Columns" = Table.RemoveColumns(#"Inserted Integer-Division",{"Index"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Integer-Division"}, {{"GROUPED", each _, type table [Column1=nullable text, #"Integer-Division"=number]}}),
    #"Removed Columns1" = Table.RemoveColumns(#"Grouped Rows",{"Integer-Division"}),
   
   //Extract each element into it's own column
    #"Added Custom" = Table.AddColumn(#"Removed Columns1", "SEQ", each Text.Split(Table.Column([GROUPED],"Column1"){0},"."){0}),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Member ID", each Text.Trim(Text.Split(Table.Column([GROUPED],"Column1"){0},"MEMBER ID"){1})),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Name", each Table.Column([GROUPED],"Column1"){1}),
    #"Added Custom3" = Table.AddColumn(#"Added Custom2", "Address", each Text.Trim(Text.Split(Table.Column([GROUPED],"Column1"){2},"TEL"){0})),
    #"Added Custom4" = Table.AddColumn(#"Added Custom3", "Telephone", each Text.Trim(Text.Split(Table.Column([GROUPED],"Column1"){2},"TEL :"){1})),
    #"Added Custom5" = Table.AddColumn(#"Added Custom4", "Mobile", each Text.Split(Text.Trim(Text.Split(Table.Column([GROUPED],"Column1"){3},":"){1})," "){0}),
    #"Added Custom6" = Table.AddColumn(#"Added Custom5", "FAX", each Text.Trim(Text.Split(Table.Column([GROUPED],"Column1"){3},"FAX :"){1})),
    #"Added Custom7" = Table.AddColumn(#"Added Custom6", "E-Mail", each Text.Trim(Text.Split(Table.Column([GROUPED],"Column1"){4},":"){1})),
    #"Added Custom8" = Table.AddColumn(#"Added Custom7", "Rep", each Text.Trim(Text.Split(Table.Column([GROUPED],"Column1"){5},":"){1})),

    //Remove the Table column
    #"Removed Columns2" = Table.RemoveColumns(#"Added Custom8",{"GROUPED"})
in
    #"Removed Columns2"

Источник

enter image description here

Results

введите описание изображения здесь

0 голосов
/ 11 августа 2020

Я очень старался решить проблему простым способом. И я пришел к следующему решению.

Sub convert()
On Error Resume Next
Dim x As Long
Dim i As Long
Dim addressString
i = 1
For x = 2 To 37093
 If Sheet1.Cells(x, 1).Font.Name = "Arial Bold" Then
 i = i + 1
 Sheet2.Cells(i, 1) = Sheet1.Cells(x - 1, 1)
 Sheet2.Cells(i, 2) = Sheet1.Cells(x, 1)
 Else
  If Sheet1.Cells(x, 2) = "TEL " Then Sheet2.Cells(i, 3) = " " & Sheet1.Cells(x, 1)
  If Sheet1.Cells(x, 2) = "MOBILE " Then Sheet2.Cells(i, 4) = " " & Sheet1.Cells(x, 1)
  If Sheet1.Cells(x, 2) = "FAX " Then Sheet2.Cells(i, 5) = " " & Sheet1.Cells(x, 1)
  If Sheet1.Cells(x, 2) = "E-MAIL " Then Sheet2.Cells(i, 6) = " " & Sheet1.Cells(x, 1)
  If Sheet1.Cells(x, 2) = "REP " Then Sheet2.Cells(i, 7) = " " & Sheet1.Cells(x, 1)
  If Sheet1.Cells(x, 2) = "" Then Sheet2.Cells(i, 8) = Sheet2.Cells(i, 8) & " " & Sheet1.Cells(x, 1)
 End If
 
Next x
'TEL
'MOBILE
'FAX
'E-MAIL
'REP

End Sub
Sub setit()
Dim x As Long
For x = 2 To 37093
 If Sheet1.Cells(x, 1).Font.Name = "Arial Bold" Then Sheet1.Cells(x + 1, 1).Font.Name = "Arial"
   
Next x
End Sub

Я установил шрифт в строке Names на один шрифт и поместил тип категории в каждую строку. например, если в строке указано «TEL», столбец B должен указать это как «TEL» и аналогично для других категорий. Приведенная выше формула сработала для меня.

0 голосов
/ 04 августа 2020

Попробуйте, пожалуйста, следующую функцию:

Function ExtractDataFromCell(x As String) As Variant
  Dim arr As Variant, arrfin(3) As String, i As Long, start As Long, length As Long
  Dim strMembID As String, strTel As String, strMob As String, strRep As String

  arr = Split(x, vbLf)
  For i = 0 To UBound(arr)
    If i = 0 Then strMembID = Right(arr(i), Len(arr(i)) - InStrRev(arr(i), " "))
    If i = 2 Then strTel = Right(arr(i), Len(arr(i)) - InStrRev(arr(i), " "))
    If i = 3 Then
        start = InStr(arr(i), ":") + 1
        length = InStr(arr(i), " FAX") - start
        strMob = Mid(arr(i), start + 1, length):
    End If
    If i = 5 Then strREP = Right(arr(i), Len(arr(i)) - InStrRev(arr(i), "  ") - 1)
  Next i
  arrfin(0) = strMembID: arrfin(1) = strTel: arrfin(2) = strMob: arrfin(3) = strREP
  ExtractDataFromCell = arrfin
End Function

Ее можно вызвать так:

Sub testExtractData()
Dim arr As Variant
 arr = ExtractDataFromCell(ActiveCell.Value)
 Debug.Print "MembID: " & arr(0)
 Debug.Print "Tel: " & arr(1)
 Debug.Print "Mob: " & arr(2)
 Debug.Print "REP: " & arr(3)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...