(Se siete alla ricerca di come convertire le tabulazioni in spazi in un editor, vedere alla fine della mia risposta)
Domanda di almeno 8 anni, ma di recente ho richiesto di sostituire le schede con gli spazi.
La soluzione sostituisce la scheda con fino a 4 o 8 spazi.
La logica itera attraverso la stringa di input, un carattere alla volta e tiene traccia della posizione corrente (colonna #) nella stringa di output.
- Se incontra
\t
(scheda char) - Finds tabulazione successiva, calcola quanti spazi di cui ha bisogno per arrivare alla fermata successiva scheda, sostituisce \ t con quelli numero di spazi.
- Se
\n
(nuova riga) - Viene aggiunto alla stringa di output e Reimposta il puntatore di posizione su 1 sulla nuova riga. Le nuove linee su Windows sono \r\n
e su UNIX (o aromi) usano \n
, quindi suppongo che questo dovrebbe funzionare per entrambe le piattaforme. Ho provato su Windows, ma non ho UNIX a portata di mano.
- Qualsiasi altro carattere: lo aggiunge alla stringa di output e incrementa la posizione.
.
using System.Text;
namespace CSharpScratchPad
{
class TabToSpaceConvertor
{
static int GetNearestTabStop(int currentPosition, int tabLength)
{
// if already at the tab stop, jump to the next tab stop.
if ((currentPosition % tabLength) == 1)
currentPosition += tabLength;
else
{
// if in the middle of two tab stops, move forward to the nearest.
for (int i = 0; i < tabLength; i++, currentPosition++)
if ((currentPosition % tabLength) == 1)
break;
}
return currentPosition;
}
public static string Process(string input, int tabLength)
{
if (string.IsNullOrEmpty(input))
return input;
StringBuilder output = new StringBuilder();
int positionInOutput = 1;
foreach (var c in input)
{
switch (c)
{
case '\t':
int spacesToAdd = GetNearestTabStop(positionInOutput, tabLength) - positionInOutput;
output.Append(new string(' ', spacesToAdd));
positionInOutput += spacesToAdd;
break;
case '\n':
output.Append(c);
positionInOutput = 1;
break;
default:
output.Append(c);
positionInOutput++;
break;
}
}
return output.ToString();
}
}
}
Il codice chiamante sarebbe come
string input = "I\tlove\tYosemite\tNational\tPark\t\t,\t\t\tGrand Canyon,\n\t\tand\tZion";
string output = CSharpScratchPad.TabToSpaceConvertor.Process(input, 4);
stringa di uscita otterrebbe valore
I love Yosemite National Park , Grand Canyon,
and Zion
Come faccio a convertire le tabulazioni in spazi in un editor?
Se ci si è imbattuti in questa domanda perché non è possibile trovare l'opzione per convertire le schede in spazi negli editor (proprio come ho fatto io e ho pensato di scrivere la propria utilità per farlo), qui è dove si trova l'opzione in diversi editor -
Notepad++: Edit > Blank Operations > TAB to Space
Visual Studio: Edit > Advanced > Untabify Selected Lines
SQL Management Studio: Edit > Advanced > Untabify Selected Lines
Alcune risposte qui non sono a conoscenza del concetto di scheda smette (vedi http : //www.gnu.org/software/emacs/manual/html_node/emacs/Tab-Stops.html e http://www.jwz.org/doc/tabs-vs-spaces.html). @ckal, Nick-McCowin e user275640 sono le risposte corrette. – Jonke
@Jonke ha pubblicato una nuova soluzione per determinare correttamente la tabulazione con un massimo di 4 o 8 spazi. – HappyTown