Разделите строку, игнорирующую заключенные в кавычки разделы

Быстрое исправление:

Чтобы удалить зазор под изображением, вы можете:

  • Установить свойство vertical-align изображения на vertical-align: bottom; vertical-align: top; или vertical-align: middle;
  • Установите для свойства отображения изображения значение display:block;

См. следующий код для живой демонстрации:

#vAlign img {
  vertical-align :bottom;
}
#block img{
  display:block;
}

div {border: 1px solid red;width:100px;}
img {width:100px;}

No fix:

With vertical-align:bottom; on image:

With display:block; on image:


Объяснение: почему существует пробел под изображением?

Разрыв или дополнительное пространство под изображением не является ошибкой или проблемой, это поведение по умолчанию. Основная причина заключается в том, что изображения заменяются элементами ( см. MDN и W3C ). Это позволяет им «действовать как изображение» и иметь собственные собственные размеры, соотношение сторон ... Браузеры вычисляют свое свойство отображения inline, но они придают им особое поведение, которое приближает их к элементам inline-block (так как вы

Это также означает, что:

[...] когда изображения используются во встроенном контексте форматирования с выравниванием по вертикали: базовая линия, нижняя часть изображения будет отображаться на базовой линии контейнера. ( source: MDN , focus mine )

blockquote>

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

Location of the baseline on text [/g15]

Элементы, выровненные по базовой линии, должны содержать место для дескрипторов которые простираются ниже базовой линии (например, j, p, g ...), как вы можете видеть на приведенном выше изображении. В этой конфигурации нижняя часть изображения выравнивается по базовой линии, как вы можете видеть в этом примере:

div{border:1px solid red;}
img{width:100px;height:auto;}
jpq are letters with descender

Вот почему поведение по умолчанию тега создает пробел в нижней части его контейнера и почему изменение свойства вертикального выравнивания или свойства отображения удаляет его, как в следующей демонстрации:

div {width: 100px;border: 1px solid red;}
img {width: 100px;height: auto;}

.block img{
  display:block;
}
.bottom img{
  vertical-align:bottom;
}

Default:

With display:block;

With vertical-align:bottom;

21
задан Nickolay 24 August 2008 в 15:22
поделиться

11 ответов

Если бы мой предпочтительный язык не предложил способ сделать это, не думая тогда, что я первоначально рассмотрел бы две возможности как простой способ:

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

  2. , Кроме того, разделяет их на запятых, тогда постанализируют полученный массив в другую проверку массива продвижение кавычек на каждой записи массива и конкатенации записей, пока я не достиг завершающейся кавычки.

Это взломы однако, и если это - чистое 'умственное' осуществление тогда, я подозреваю, что они окажутся бесполезными. Если бы это - проблема реального мира тогда, она помогла бы знать язык так, чтобы мы могли дать некоторый определенный совет.

1
ответ дан 29 November 2019 в 21:17
поделиться

Python:

import csv
reader = csv.reader(open("some.csv"))
for row in reader:
    print row
6
ответ дан 29 November 2019 в 21:17
поделиться

Похож у Вас есть некоторые хорошие ответы здесь.

Для тех из Вас смотрящий на дескриптор Ваш собственный парсинг файла CSV, учтите совет от экспертов, и не прокручивают Ваш собственный синтаксический анализатор CSV .

Ваша первая мысль, , "Я должен обработать запятые в кавычках".

Ваша следующая мысль будет, , "О, дерьмо, я должен обработать кавычки в кавычках. Завершенные кавычки. Двойные кавычки. Одинарные кавычки..."

Это - дорога к безумию. Не пишите свое собственное. Найдите библиотеку с обширным покрытием модульного теста, которое поражает все твердые части и прошло ад для Вас. Для.NET используйте свободное библиотека FileHelpers.

20
ответ дан 29 November 2019 в 21:17
поделиться

Конечно, использование синтаксического анализатора CSV лучше, но просто ради удовольствия Вы могли:

Loop on the string letter by letter.
    If current_letter == quote : 
        toggle inside_quote variable.
    Else if (current_letter ==comma and not inside_quote) : 
        push current_word into array and clear current_word.
    Else 
        append the current_letter to current_word
When the loop is done push the current_word into array 
2
ответ дан 29 November 2019 в 21:17
поделиться

Я использую это для парсинга строк, не уверенных, если это помогает здесь; но с некоторыми незначительными модификациями, возможно?

function getstringbetween($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);   
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

$fullstring = "this is my [tag]dog[/tag]";
$parsed = getstringbetween($fullstring, "[tag]", "[/tag]");

echo $parsed; // (result = dog) 

/ член парламента

0
ответ дан 29 November 2019 в 21:17
поделиться

Автор здесь заглядывал блобу кода C#, который обрабатывает сценарий, с которым у Вас есть проблема:

Импорт файла CSV в .NET

не Должен быть слишком трудным для перевода.

1
ответ дан 29 November 2019 в 21:17
поделиться

, Что, если нечетное число кавычек появляется в исходной строке?

Это странно походит на парсинг CSV, который имеет некоторые особенности к обработке заключенных в кавычки полей. Поля только оставляют, если поле разграничено с двойными цитатами, таким образом:

field1, "field2, field3", field4, "field5, field6" field7

становится

field1

field2, Уведомление field7

"field5

field6" field3

field4

, если это и не запускается и заканчивается цитатой, тогда это не заключенное в кавычки поле, и двойные кавычки просто рассматривают как двойные кавычки.

Insedently мой код, что кто-то связанный с на самом деле не обрабатывает это правильно, если я вспоминаю правильно.

1
ответ дан 29 November 2019 в 21:17
поделиться

Это - стандартный синтаксический анализ стиля CSV. Много людей пытается сделать это с регулярными выражениями. Можно добраться приблизительно до 90% с regexes, но Вам действительно нужен реальный синтаксический анализатор CSV, чтобы сделать это правильно. Я нашел быстрый, превосходный синтаксический анализатор CSV C# на CodeProject несколько месяцев назад, что я настоятельно рекомендую!

0
ответ дан 29 November 2019 в 21:17
поделиться

Вот один в псевдокоде (иначе Python) в одном:-P

def parsecsv(instr):
    i = 0
    j = 0

    outstrs = []

    # i is fixed until a match occurs, then it advances
    # up to j. j inches forward each time through:

    while i < len(instr):

        if j < len(instr) and instr[j] == '"':
            # skip the opening quote...
            j += 1
            # then iterate until we find a closing quote.
            while instr[j] != '"':
                j += 1
                if j == len(instr):
                    raise Exception("Unmatched double quote at end of input.")

        if j == len(instr) or instr[j] == ',':
            s = instr[i:j]  # get the substring we've found
            s = s.strip()    # remove extra whitespace

            # remove surrounding quotes if they're there
            if len(s) > 2 and s[0] == '"' and s[-1] == '"':
                s = s[1:-1]

            # add it to the result
            outstrs.append(s)

            # skip over the comma, move i up (to where
            # j will be at the end of the iteration)
            i = j+1

        j = j+1

    return outstrs

def testcase(instr, expected):
    outstr = parsecsv(instr)
    print outstr
    assert expected == outstr

# Doesn't handle things like '1, 2, "a, b, c" d, 2' or
# escaped quotes, but those can be added pretty easily.

testcase('a, b, "1, 2, 3", c', ['a', 'b', '1, 2, 3', 'c'])
testcase('a,b,"1, 2, 3" , c', ['a', 'b', '1, 2, 3', 'c'])

# odd number of quotes gives a "unmatched quote" exception
#testcase('a,b,"1, 2, 3" , "c', ['a', 'b', '1, 2, 3', 'c'])
передачи
0
ответ дан 29 November 2019 в 21:17
поделиться

Вот простой алгоритм:

  1. Определяют, начинается ли строка '"' символ
  2. Разделение строка в массив, разграниченный '"' символ.
  3. Mark заключенные в кавычки запятые с заполнителем #COMMA#
    • , Если вход запускается с '"', отметьте те объекты в массиве, где индексный % 2 == 0
    • Иначе метка те объекты в массиве, где индексный % 2 == 1
  4. Связывают объекты в массиве для формирования измененной входной строки.
  5. Разделение строка в массив разграничена ',' символ.
  6. Замена все экземпляры в массиве #COMMA# заполнители с ',' символ.
  7. массив является Вашим выводом.

Heres реализация Python:
(прикрепленный к дескриптору '"a, b", c, "d, e, f, h", "я, j, k"')

def parse_input(input):

    quote_mod = int(not input.startswith('"'))

    input = input.split('"')
    for item in input:
        if item == '':
            input.remove(item)
    for i in range(len(input)):
        if i % 2 == quoted_mod:
            input[i] = input[i].replace(",", "#COMMA#")

    input = "".join(input).split(",")
    for item in input:
        if item == '':
            input.remove(item)
    for i in range(len(input)):
        input[i] = input[i].replace("#COMMA#", ",")
    return input

# parse_input('a,"string, with",various,"values, and some",quoted')
#  -> ['a,string', ' with,various,values', ' and some,quoted']
# parse_input('"a,b",c,"d,e,f,h","i,j,k"')
#  -> ['a,b', 'c', 'd,e,f,h', 'i,j,k']
0
ответ дан 29 November 2019 в 21:17
поделиться

Я просто не мог сопротивляться, чтобы видеть, мог ли я заставить его работать в остроте Python:

arr = [i.replace("|", ",") for i in re.sub('"([^"]*)\,([^"]*)"',"\g<1>|\g<2>", str_to_test).split(",")]

Возвраты ['строка, с', 'различный', 'значения и некоторые', 'заключенный в кавычки']

Это работает первой заменой'', в заключает в кавычки к другому разделителю (|), разделяя строку на'', и заменяя | разделитель снова.

0
ответ дан 29 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: