Проблема деления текста Javascript на вкладки (многострочные ячейки) - PullRequest
0 голосов
/ 28 мая 2011

У меня странная проблема на моей веб-странице, в частности с элементом текстовой области, который получает буфер обмена от пользователя.

Пользователь выполняет CTRL + V; и я создал событие для получения данных с событием KeyUp.

... это прекрасно работает ...

Но, когда я пытаюсь разделить на каждый «ряд» этой текстовой области; начать проблемы ... Ввод может быть похож на этот пример:

excel

Данные читаются примерно так:

Row1 [0] [HT] Row1 [1] [LF] "Row2 [0] Строка комментария 1 [LF] Row2 [0] Строка комментария 2" [HT] Row2 [1]

Где: [HT] означает {Tab} [LF] означает {Новая строка}

Я использую:

var myData = document.getElementById("TextAreaElement").value;
var vArray = myData.split(/\n/);

Но этот массив возвращает мне 3 строки ...

debug


Кто-нибудь знает какое-нибудь решение или альтернативный способ?

Ответы [ 3 ]

0 голосов
/ 28 мая 2011

Относительно проблемы «.»не соответствует переводу строки, стандартным способом сделать это в JS является [\S\s], который будет соответствовать чему угодно.

Похоже, все, что вы хотите сделать для начала, это разделить строку на вкладки, верно?Тогда ...

result = string.split(/\t/)

Тогда у вас будет массив с отдельными данными каждой строки.Обратите внимание, что это работает только в том случае, если ваши данные не могут иметь дополнительных ошибочных вкладок.

Какой бы инструмент ни вводил информацию в буфер обмена, он действительно должен быть экранирован, прежде чем он будет скопирован и проанализирован вашим JS.Если он не может этого сделать, то на самом деле ничего не получается - в этом случае вы не можете гарантировать, что в вашей строке не будет двойных кавычек, табуляции или других символов, которые вы можете попытаться использовать в качестве разделителя.

0 голосов
/ 30 мая 2011

Ну, я не нахожу способ работать с каким-либо регулярным выражением или методом javascript (я считаю, что это можно сделать).Я работал по-другому, чтобы разделить информацию.

Я использовал AJAX, чтобы отправить эту информацию на сервер и выполнить разделение в VB.В резюме:

  1. Я получаю максимальное количество столбцов (разделенных по вкладкам).

  2. Получите и оцените каждое значение массива вкладок.

  3. Если начать с двойных кавычек, попытался найти конец двойных кавычек (до этого заменил средние двойные кавычки уникальным текстом)

  4. Каждый раз, когда оценивался элемент исходного массива, я удалял каждый элемент (Всегда оценивать элемент 0) ...

  5. Если найти новую строку (окончание строки), только удален текст «последнего столбца» предыдущего ряда.

Надеюсь, помогите кому-нибудь с такой же проблемой.Cheers.

Вот код:

Public Function TEST(ByVal pText As String) As String
    Try
        Dim vText As String = pText

        Dim vArray As New ArrayList
        vArray.AddRange(vText.Split(vbNewLine))
        Dim vActualIndex As Integer = 0

        Dim vMaxColumns As Integer = 0

        For Each vArrayItem In vArray
            If vArrayItem.Split(vbTab).Length > vMaxColumns Then
                vMaxColumns = vArrayItem.Split(vbTab).Length
            End If
        Next

        Dim vActualArray(vMaxColumns - 1) As String
        vArray = New ArrayList
        vArray.AddRange(vText.Split(vbTab))

        Dim vLen As Integer = vArray.Count
        Dim vNewArray As New ArrayList

        vActualIndex = 0

        Do While vArray.Count <> 0
            If vArray(0).Split(vbNewLine).Length = 1 Then
                vActualArray(vActualIndex) = vArray(0)
                vActualIndex += 1
            Else
                If vArray(0).Split(vbNewLine)(0).ToString.StartsWith("""") Then
                    vArray(0) = Mid(vArray(0), 2).Replace("""""", "*_IDIDIDUNIQUEID_*")

                    If InStr(vArray(0), """" & vbNewLine) <> 0 Then
                        vActualArray(vActualIndex) = Mid(vArray(0), 1, InStr(vArray(0), """" & vbNewLine) + 1)
                        vArray(0) = Mid(vArray(0), InStr(vArray(0), """" & vbNewLine) + 3)

                        vActualArray(vActualIndex) = vActualArray(vActualIndex).ToString.Replace("*_IDIDIDUNIQUEID_*", """""")
                        vArray(0) = vArray(0).ToString.Replace("*_IDIDIDUNIQUEID_*", """""")

                        vActualIndex += 1

                        GoTo Skip_remove
                    End If

                    vArray(0) = vArray(0).ToString.Replace("*_IDIDIDUNIQUEID_*", """""")
                    vActualArray(vActualIndex) = vArray(0)
                    vActualIndex += 1
                Else
                    vActualArray(vActualIndex) = vArray(0).Split(vbNewLine)(0)
                    vActualIndex += 1

                    vArray(0) = vArray(0).ToString.Substring(vArray(0).Split(vbNewLine)(0).ToString.Length + 2)
                    GoTo Skip_remove
                End If
            End If

            vArray.RemoveAt(0)

'Это метка в VB-коде Skip_remove:

            If vActualIndex >= vMaxColumns Then
                vNewArray.Add(vActualArray)

                ReDim vActualArray(vMaxColumns - 1)

                vActualIndex = 0
            End If
        Loop
    Catch ex As Exception
        Return ""
    End Try
End Function
0 голосов
/ 28 мая 2011

Вы получаете текст, содержащий три строки, разбиваете его на разрывы строк и получаете массив из трех элементов. Похоже, это работает. :) Теперь, что вам нужно сделать, это взять каждый из этих предметов и разделить их на вкладке (= \t)

[править]

Нет, теперь я понимаю, что вы имеете в виду. Вы не получите там с помощью этого разделения. Вам придется проанализировать строку. Значение поля может содержать ввод, в этом случае оно будет заключено в двойные кавычки. Поэтому вам придется анализировать строку и не разбивать ее на разрыв, когда вы все еще находитесь в наборе кавычек.

...